zoukankan      html  css  js  c++  java
  • 翻车——真翻车了

    翻车

    题目简介:

    翻车 (rollover.cpp/c/pas)
    【问题描述】 有一天,小武找到了翻车王,给了他n个整数a1,a2,a3,…an,翻车王 需要选择其中的k个数,使得选出的k个数中任意两个的差都可以被m整除。 选出的数可以重复,但不可以超过这n个数中该数的个数。 翻车王不想翻车,所以需要你的帮助。
    【输入格式】 第一行包括3个整数 n,k,m(2 ≤ k ≤ n ≤ 100000,1 ≤ m ≤ 100000), n,k,m意义见题面。 第二行包括n个数a1,a2,a3,…an(0 ≤ ai ≤ 1000000000)。
    【输出格式】 如果不可以选出k个数,使得选出这k个数中任意两个的差都可以被m整 除,那么输出“No”。 否则,在第一行输出“Yes”。在第二行输出这k个整数b1,b2,...bk (所选的数字),两两数之间有一个空格。如果有多种选择k个数字的方案, 请输出任意一种。
    【输入输出样例】 rollover.in rollover.out 435 2777 Yes 277
    【数据说明】 20%的数据 n ≤ 15 50%的数据 n ≤ 1000 另外20%的数据 m ≤ 1000 100%的数据 2 ≤ k ≤ n ≤ 10^5,1 ≤ m ≤ 10^5,0≤ ai ≤10^9

    思路:

    因为是mod”m“所以只需要找到他们的余数,若相减可得0则他们肯定能整除m。然后从小到大,到了K就直接不搞了。用一个东西储存是否能找到K个,代码大概如下。虽然我提交了3遍很简单,但还是要小心。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    const int inf=0X7f7f7f7f;
    using namespace std;
    int n,k,m,ans=0,t=inf;
    int main()
    { 
        cin>>n>>k>>m;
        long long a[n+1],sum[n+1];
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            sum[a[i]%m]++;
        }
        for(int i=0;i<m;i++)
        {
            if(sum[i]>=k)
            cout<<"Yes"<<endl;
            t=i;
            break;
        }
        if(t==inf)
        cout<<"No";
        else
        for(int i=1;i<=n;i++)    
        {
            if(a[i]%m==t);
            {
                ans++;
                if(ans<=k)
                cout<<a[i]<<" ";
                else break;
            }
        }
        return 0;
    }

    别翻车了,各位朋友!!!

  • 相关阅读:
    python学习笔记(三):numpy基础
    python学习笔记(二):基础知识点
    python学习笔记(一):基础知识点
    SQL学习笔记:分块提取查询结果
    SQL学习笔记:函数
    SQL学习笔记:高级教程
    SQL学习笔记:基础教程
    R语言学习笔记(二十一五):如何如何提升R语言运算的性能以及速度
    R语言学习笔记(二十四):plyr包的用法
    Rsyslog的三种传输协议简要介绍
  • 原文地址:https://www.cnblogs.com/YYCether666/p/11185389.html
Copyright © 2011-2022 走看看