嵊州普及Day4T1

题意:从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;
}

好题哉!!!

 

posted @ 2019-07-14 19:22  青殇  阅读(96)  评论(0编辑  收藏  举报