【Codeforces 996B】World Cup

【链接】 我是链接,点我呀:)
【题意】

【题解】

你可以找出来a[i]里面的最小值mi,显然是这个数字最可能先变成0,但还不确定. 然后用mi/n得到你最少需要走多少圈才能让那个mi变成"只差一圈"就变成0. 那么把所有的a[i]都减去mi/n*n 然后再手动地模拟一圈(显然再模拟一圈就能让某个a[i]变成0了,即让那个mi变成0 但是有例外 比如说 6 5 7 8 9 10 这6个数字 mi=5 5/6=0 所以一开始a[i]不用减去任何数字. 但是你第一次遇到5的时候,5只变成了4.还没有变成0. 所以还得再模拟一圈. 这种情况,就模拟两圈就ok了。 综上,模拟两圈一定能得到a[i]=0的.

【代码】

#include <bits/stdc++.h>
#define rep1(i,a,b) for (int i = a;i <= b;i++)

using namespace std;

const int N = 1e5;

int n;
int a[N+10],mi;

int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin >> n;
    rep1(i,1,n) cin >> a[i];
    mi = a[1];rep1(i,1,n) mi = min(mi,a[i]);
    int quan = mi/n;
    rep1(i,1,n) a[i] -= quan*n;
    int past = 0;
    rep1(i,1,n){
        if (a[i]-past<=0){
            cout<<i<<endl;
            return 0;
        }
        past++;
    }

    rep1(i,1,n){
        if (a[i]-past<=0){
            cout<<i<<endl;
            return 0;
        }
        past++;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/AWCXV/p/9741847.html