写了一晚上bug,睡觉去,明天坐等答案吧,心累了

Codeforces Round #653 (Div. 3)

Zero Remainder Array
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
You are given an array a consisting of n positive integers.

Initially, you have an integer x=0. During one move, you can do one of the following two operations:

Choose exactly one i from 1 to n and increase ai by x (ai:=ai+x), then increase x by 1 (x:=x+1).
Just increase x by 1 (x:=x+1).
The first operation can be applied no more than once to each i from 1 to n.

Your task is to find the minimum number of moves required to obtain such an array that each its element is divisible by k (the value k is given).

You have to answer t independent test cases.

Input
The first line of the input contains one integer t (1≤t≤2104) — the number of test cases. Then t test cases follow.

The first line of the test case contains two integers n and k (1≤n≤2105;1≤k≤109) — the length of a and the required divisior. The second line of the test case contains n integers a1,a2,,an (1≤ai≤109), where ai is the i-th element of a.

It is guaranteed that the sum of n does not exceed 2105 (∑n≤2105).

Output
For each test case, print the answer — the minimum number of moves required to obtain such an array that each its element is divisible by k.

Example
input
5
4 3
1 2 1 3
10 6
8 7 1 8 3 7 5 10 8 9
5 10
20 100 50 20 100500
10 25
24 24 24 24 24 24 24 24 24 24
8 8
1 2 3 4 5 6 7 8
output
6
18
0
227
8
Note
Consider the first test case of the example:

x=0, a=[1,2,1,3]. Just increase x;
x=1, a=[1,2,1,3]. Add x to the second element and increase x;
x=2, a=[1,3,1,3]. Add x to the third element and increase x;
x=3, a=[1,3,3,3]. Add x to the fourth element and increase x;
x=4, a=[1,3,3,6]. Just increase x;
x=5, a=[1,3,3,6]. Add x to the first element and increase x;
x=6, a=[6,3,3,6]. We obtained the required array.
Note that you can't add x to the same element more than once.

在这里插入图片描述
写的一晚上bug

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <vector>

using namespace std;
int a[200005];
struct g {
    int number, count;
    bool operator<(g b) {
        if (count == b.count) return number > b.number;
        return count < b.count;
    }
} ge[200005];
int main() {
#ifdef LOCAL
    freopen("zz_in.txt", "r", stdin);
    freopen("zz_op.txt", "w", stdout);
#endif
    unsigned long long ans;
    int i, t, n, k, p;
    cin >> t;
    while (t--) {
        ans = 0;
        cin >> n >> k;
        for (i = 0; i < n; i++) {
            cin >> a[i];
        }
        for (i = 0; i < n; i++)
            a[i] = a[i] % k;
        sort(a, a + n);
        p = 0;
        ge[p].number = a[0];
        ge[p].count = 0;
        for (i = 0; i < n; i++) {
            if (a[i] == ge[p].number)
                ge[p].count++;
            else {
                p++;
                ge[p].count = 1;
                ge[p].number = a[i];
            }
        }
        p++;
        sort(ge, ge + p);
        if (ge[p - 1].number == 0) {
            if (p == 1)
                cout << "0" << endl;
            else {
                ans = ge[p - 2].count * k - ge[p - 2].number + 1;
                cout << ans << endl;
            }
        } else {
            ans = ge[p - 1].count * k - ge[p - 1].number + 1;
            cout << ans << endl;
        }
    }

#ifdef LOCAL
    printf("Time used = %.2f\n", (double) clock() / CLOCKS_PER_SEC);
#endif
    return 0;
}

自己造了几组数,明明没问题啊
本来卡test2,结果把好几十行的循环换了个结构体,又卡test 5,醉了

        //     if (a[i] == 0) continue;
        //     if (a[i] == temp) {
        //         cishu_temp++;
        //         if (i == n - 1) {
        //             zuiduo = temp;
        //             cishu = cishu_temp;
        //             if (cishu_temp > cishu) {
        //                 zuiduo = temp;
        //                 cishu = cishu_temp;
        //                 cishu_temp = 1;
        //                 temp = a[i];
        //                 continue;
        //             }
        //             if (cishu_temp == cishu) {
        //                 if (temp < zuiduo) {
        //                     zuiduo = temp;
        //                     cishu_temp = 1;
        //                     temp = a[i];
        //                 } else {
        //                     cishu_temp = 1;
        //                     temp = a[i];
        //                 }
        //                 continue;
        //             }
        //             if (cishu_temp < cishu) {
        //                 cishu_temp = 1;
        //                 temp = a[i];
        //             }
        //         }
        //     } else {
        //         if (cishu_temp > cishu) {
        //             zuiduo = temp;
        //             cishu = cishu_temp;
        //             cishu_temp = 1;
        //             temp = a[i];
        //             continue;
        //         }
        //         if (cishu_temp == cishu) {
        //             if (temp < zuiduo) {
        //                 zuiduo = temp;
        //                 cishu_temp = 1;
        //                 temp = a[i];
        //             } else {
        //                 cishu_temp = 1;
        //                 temp = a[i];
        //             }
        //             continue;
        //         }
        //         if (cishu_temp < cishu) {
        //             cishu_temp = 1;
        //             temp = a[i];
        //         }
        //     }
        // }
        // if (a[0] == a[n - 1]) {
        //     if (a[0] == 0) {
        //         cout << "0" << endl;
        //         continue;
        //     }
        //     zuiduo = a[0];
        //     cishu = n;
        // }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值