题意:从n个数中选出k个数,使他们任意两数之差都等于m。
思路:任意差值都等于m,不就等价于k个数模m余数相同吗?
然后桶排储蓄一下各数余数即可。
见代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int n,k,m,s,flag,sum,a[100001],b[100001]; int main() { // freopen("rollover.in","r",stdin); // freopen("rollover.out","w",stdout); cin>>n>>k>>m; for(int i=1;i<=n;i++) { cin>>s; a[s]++; b[s%m]++; } for(int i=1;i<=n;i++) if(b[i]>=k) { flag=i; cout<<"Yes"<<endl; break; } if(flag!=0) for(int i=flag;sum<=k;i+=m) { while(a[i]>0&&sum<k) { cout<<i<<" "; a[i]--; sum++; } } else cout<<"No"; return 0; }
好吧又炸了。
注意主函数第10行循环细微的区别,本来循环m的循环了n,这里就不解释了。
见代码*2:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int n,k,m,s,flag,sum,a[100001],b[100001]; int main() { // freopen("rollover.in","r",stdin); // freopen("rollover.out","w",stdout); cin>>n>>k>>m; for(int i=1;i<=n;i++) { cin>>s; a[s]++; b[s%m]++; } for(int i=0;i<m;i++) if(b[i]>=k) { flag=i; cout<<"Yes"<<endl; break; } if(flag!=0) for(int i=flag;sum<=k;i+=m) { while(a[i]>0&&sum<k) { cout<<i<<" "; a[i]--; sum++; } } else cout<<"No"; return 0; }