数字计数
题意:求最大的数字与次大的数字之差,最大的数字与次小的数字之差,次大的数字与次小的数字之差,次大的数字与最小的数字之差。
思路:题目的数据量比较小,直接用一个sort排好序后进行求解即可,注意去重即可。
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=100010; int a[1000]; int main(){ int n; cin>>n; map<int,int> mp; int k=0; for(int i=0;i<n;i++){ int x; cin>>x; mp[x]++; if(mp[x]==1){ a[k++]=x; } } sort(a,a+k); cout<<a[k-1]-a[k-2]<<" "; cout<<a[k-1]-a[1]<<" "; cout<<a[k-2]-a[1]<<" "; cout<<a[k-2]-a[0]<<endl; return 0; }
数颜色
题意:给你一个序列,长度为n,求这个序列的所有的子区间中不同的数的个数之和。
思路:我们发现,我们的长度比较小,故可以直接用暴力求解,我们用两重循环来枚举这个序列所有的子区间,然后对于每个子区间,我们直接用set来存储数字,最后加上set的大小即可。
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=100010; ll a[1010]; map<int,int> mp; int main(){ int n; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } ll ans=0; for(int i=1;i<=n;i++){ set<int>st; for(int j=i;j<=n;j++){ st.insert(a[j]); ans+=st.size(); } } cout<<ans<<endl; return 0; }
智斗恶龙
题意:给你一个矩阵,规定在某个位置开始移动,移动的距离最长为d,在可以移动的范围内,选择至少x个宝藏,然后使得这x个的最大和最小的差值最小。注意不能经过陷阱。
思路:一个很裸的bfs,我们先利用bfs来求出我们一共可以获得几种不同的宝藏,然后我们就可以对这些宝藏进行讨论了。其次是要注意几个点:1、可能一开始就在陷阱里面,这是我们要看x的具体值进行分析。2、假设我们求到的宝藏的个数为n>=x,我们要对这n个宝藏进行讨论,我们要维护一个区间长度为x的两端的差值。3、这个宝藏的表示的数可能十分大,我们可以用一个set进行去重和离散化即可。
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; int n,m,dx,dy,d,x; ll a[1010][1010]; int X[]={0,0,1,-1},Y[]={1,-1,0,0}; bool inq[1010][1010]; struct node{ int x,y; int dis; }Node; bool judge(int x,int y){ if(x<1||y<1||x>n||y>m) return false; if(a[x][y]==-1) return false; if(inq[x][y]) return false; return true; } void solve(){ set<ll> st; vector<ll> v; memset(inq,false,sizeof(inq)); cin>>n>>m>>dx>>dy>>d>>x; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j]; } } if(a[dx][dy]==-1){ if(x>0) cout<<"no"<<endl; else cout<<"0"<<endl; return; } Node={dx,dy,0}; if(a[dx][dy]>0){ st.insert(a[dx][dy]); v.push_back(a[dx][dy]); } queue<node> q; q.push(Node); inq[dx][dy]=true; while(q.size()){ node top=q.front(); q.pop(); for(int i=0;i<4;i++){ int newx=X[i]+top.x,newy=Y[i]+top.y; if(judge(newx,newy)&&top.dis<d){ if(a[newx][newy]>0&&st.find(a[newx][newy])==st.end()){ // cout<<a[newx][newy]<<endl; st.insert(a[newx][newy]); v.push_back(a[newx][newy]); } Node={newx,newy,top.dis+1}; inq[newx][newy]=true; q.push(Node); } } } if(st.size()<x) cout<<"no"<<endl; else{ int len=v.size(); ll ans=1e18; sort(v.begin(),v.end()); for(int i=x-1;i<len;i++){ ll tmp=v[i]-v[i-x+1]; ans=min(ans,tmp); } cout<<ans<<endl; } } int main(){ int t; cin>>t; while(t--){ solve(); } return 0; }
能量水晶
由于对背包问题还不是太了解,先放着,也许一个礼拜后会回来补。ORZ