题目链接:http://codeforces.com/problemset/problem/750/C
解题思路:对于当前给定的条件,rating有一个范围,我们可以每次从后往前维护这个范围,以满足更多条件的限制
1、每次的rating范围l<=r 且满足在div1还是在div2的rating条件,如果不能同时满足这两个条件即没有满足要求的rating值存在,输出"Impossible";2、要求输出尽可能大的rating,即(l,r)中最大rating:r+ans(n次比赛rating的变化量);
3、如果最后的范围r>=20001900(题目所给范围n*c[i]+1900),则rating就会无限大,按照题目要求输出"Infinity"。
代码实现:
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<math.h>
#include<queue>
#include<map>
#include<stack>
#define mann 200008
#define INF 99999999
typedef long long LL;
using namespace std;
struct node
{
int x,y;
} c[mann];
int main()
{
int n;
while(~scanf("%d",&n))
{
int ans=0,flag=0;
for(int i=0; i<n; i++)
{
scanf("%d%d",&c[i].x,&c[i].y);
ans+=c[i].x;//总的变化量
}
int l=-INF,r=INF;
for(int i=n-1; i>=0; i--)
{
l-=c[i].x;
r-=c[i].x;
if(c[i].y==1)
{
l=max(l,1900);//维护当前范围
if(l>r||r<1900)//判断是否满足条件
{
flag=1;
break;
}
}
else
{
r=min(r,1899);
if(l>r||l>1899)
{
flag=1;
break;
}
}
// printf("%d*%d ",l,r);
}
if(flag)
printf("Impossible\n");
else if(r>=20001900)
printf("Infinity\n");
else
printf("%d\n",ans+r);
}
}