【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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值