Codeforces 939C - Convenient For Everybody

题目链接:http://codeforces.com/problemset/problem/939/C

题意:1~n个时区,第i个时区将要参加比赛的人数为ai,给出比赛的开始时间S和比赛结束时间F,问第一个时区时间为多少的时候能让参加比赛的人数最多,即输出此时第一个时区的时间。

实话说这道题在contest的时候我是完全不会的(连题意都读不懂那种),不知道样例为什么这么输出(好吧,读写弱鸡紫),然后在看了一些题解题意,并在G哥的帮助下(G哥.orz),不是很顺利地写出这道题。我来说一下我写这道题遇见的一些问题。

1.把第一个时区作为标准时区,比如有3个时区,第一个时区为1点时,第二个第三个分别为2,3点;第一个时区为2点时,第二个第三个分别为3,1点;第一个时区为3点时,第二个第三个分别为1,2点。
2.区间的移动从右到左,这样才比较好处理时区这样的变化。
3.然而我还是得参考别人时区变化的处理(菜到安详.jpg)。

下面是我的代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define mst(a,b) memset(a,b,sizeof(a))
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
#define pii pair
const int N = 1e9;
const int mod=(int)1e9+7;
const int INF=0x3f3f3f3f;
const long long LINF=(1LL<<62);
typedef long long LL;
//#define LOCAL
const double PI = acos(-1.0);
const int maxn=1e5+5;
using namespace std;

int a[maxn];

bool cmp(int a, int b)
{
    return a>b;
}

int gcd(int a, int b)
{
    return (b==0)?a:gcd(b,a%b);
}


int main()
{
#ifdef LOCAL
    freopen("test.txt", "r", stdin);
#endif // LOCAL
    int n, s, f, sum; scanf("%d", &n);
    for(int i = 1; i <= n; i++) scanf("%d", &a[i%n]);//这里的模处理有点妙,语言表达不出来,自己写一写才知道
    scanf("%d%d", &s, &f);
    for(int i = s; i < f; i++) sum+=a[i%n];          //注意比赛时间是一个小时,所以第f个时区参加的人不能取
    int mmax = sum, pos = 0;                         //这里一个区间和是把第一个时区默认为1点的时候,所以pos=0;
    for(int i = 1; i < n; i++){
        int l = (s-i+n)%n;
        int r = (f-i+n)%n;
        sum+=a[l];sum-=a[r];                         //区间往左滑动
        if(sum>mmax){
            mmax = sum;
            pos = i;
        }
    }
    printf("%d", pos+1);
    return 0;
}

慢慢加油吧!!O(∩_∩)O

你可能感兴趣的:(codeforces)