A. Eshag Loves Big Arrays
题意:给你n个数,每次可以选择任意数量的ai,将其中的平均值算出来,然后把大于平均值的数都可以删掉。
思路:每次放两个就可以发现只有数组最小的值不能删。
#include<bits/stdc++.h> using namespace std; int a[105]; int main() { int n,i,j,t; cin>>t; while(t--){ cin>>n; map<int ,int >mo; int max1=inf; for(i=0;i<n;i++){ cin>>a[i]; mo[a[i]]++; max1=min(max1,a[i]); } cout<<n-mo[max1]<<endl; } return 0; }
B. Sifid and Strange Subsequences
题意:要求从数组里选出n个数,且使其中下标i<j的任何对数都满足|ai-aj|>=Max,Max是数组里最大的数。
思路:一开始想的是分类讨论,主要难点是在选正和负的时候,注意负数的间隔还有0和负数都要。
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+1000; int a[maxn]; int fuu[maxn]; int main() { int n,i,j,t; cin>>t; while(t--){ cin>>n; map<int ,int >mo; int f=0,z=0,zero=0,max1=0,fu=0,min1=inf,minf1=-inf; for(i=0;i<n;i++){ cin>>a[i]; if(a[i]==0) { zero++; } else if(a[i]>0) { mo[a[i]]++; z=1; max1=max(max1,mo[a[i]]); min1=min(min1,a[i]); } else { mo[a[i]]++; f=1; fuu[fu++]=a[i]; minf1=max(a[i],minf1); } } if(f==0&&z==0){ cout<<n<<endl; } else if(f==1&&z==0){ cout<<n<<endl; } else if(z==1&&f==0){ if(zero!=0) cout<<max(zero,2)<<endl; else cout<<1<<endl; } else { sort(fuu,fuu+fu); int minn=inf,x; for(int d1=0;d1<fu-1;d1++){ x=abs(fuu[d1]-fuu[d1+1]); minn=min(minn,x); } if(minn>=min1){ cout<<fu+(zero==0?0:1)+1<<endl; } else { cout<<fu+(zero==0?0:1)<<endl; } } } }