Codeforces 750C

题目:很多OJ有自己的比赛和等级,比赛分为A组比赛和B组比赛,规定当等级小于等于1899时,只能参加B组比赛,当等级大于等于1900时,只能参加A组比赛。现在给出某人若干次比赛的数据,数据包括他参加获得的等级的变化和参加的组别,在不知道初始等级的情况下,计算这个人参加完这若干次比赛后最高的等级是多少,计算结果必须是可行的,即不能出现不符合组别等级参赛的情况。

输入输出:
输入的第一行为一个整数n(1 ≤ n ≤ 200 000)。
接下来输入n行,每行有两个整数ci 和di( - 100 ≤ ci ≤ 100, 1 ≤ di ≤ 2),代表某人参加了di组别的比赛,等级变化了ci,其中di = 1代表参加A组比赛,di = 2代表参加B组比赛。

如果等级可以无限大,那么输出“Infinity”,如果参赛情况不可能出现,那么输出“Impossible”,其他情况输出参加完n次比赛后可能的最高分。

思路:
1900分是一个界限.
设一开始的时候分数为x
则如果第一个d = 1; 则上限为INF
如果第一个d=2,则上限为1899
如果下一场比赛为div1,则x+c1+c2+…+ci>=1900
如果下一场比赛为div2 ,则x+c1+c2+…+ci<=1899

x>=1900-c1-c2…ci div1
x<=1899-c1-c2…ci; div2
在做的过程中搞一个前缀和 delta+=ci; (delta=c1+c2…ci); 维护一下x的最小值和最大值; 然后用x的最大值加上delta; 就能直接获取最后的分数了;

#include 
using namespace std;
const int inf=0x3f3f3f3f;
int n;
int d1=-inf,d2=inf;
int main()
{
    int sum=0;
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        int c,d;
        cin>>c>>d;
        if(d==1)
            d1=max(d1,1900-sum);
        else
            d2=min(d2,1899-sum);
        sum+=c;
    }
    if(d1>d2)
        cout<<"Impossible"<<endl;
    else if(d2==inf)
        cout<<"Infinity"<<endl;
    else
        cout<<d2+sum<<endl;
}

你可能感兴趣的:(CF,题目)