本文共 1344 字,大约阅读时间需要 4 分钟。
标签:水题
/* 题意:给n个数,选k个,要求在k里面任选2个数都能被m整除。 注意n里面可以有相同的数。 思路:对每个数initial[i],保存initial[i]%m在mod[i]。 找出现次数(ans)最多的那个余数,若ans >= k,有解;否组无解。见代码。*/#include#include using namespace std;const int maxn = 100005;int initial[maxn], mod[maxn];int main(){ int n, k, m; while(scanf("%d %d %d", &n, &k, &m) != EOF) { for(int i = 0; i < n; i++) { scanf("%d", &initial[i]); mod[i] = initial[i] % m; // } sort(mod, mod + n); //找出现次数(ans)最多的那个余数 int temp = mod[0], total = 0, ans = 0, flag; for(int i = 0; i < n; i++) { if(temp == mod[i]) total++; else { temp = mod[i]; total = 1; //total = 1 } if(total > ans) { ans = total; flag = temp; } } if(ans >= k) //输出 { printf("Yes\n"); int time = 0; for(int i = 0; i < n; i++) { if(initial[i] % m == flag && time < k) //time < k, 选k个数 { printf("%d ", initial[i]); time++; } } printf("\n"); } else printf("No\n"); } return 0;}
转载地址:http://dikxi.baihongyu.com/