记录一个菜逼的成长。。
题目链接
题目大意:
一个人初始有个rating值(可以为负),参加了n场比赛,
接下来n行,给出rating的变化和所要参加的比赛等级( 1 or 2 )
问最后可以获得的最大的rating为多少
注意:rating变化是在比赛结束之后,而判断参加的比赛等级是在比赛之前
二分初始值,判断是否可行,
判断时要注意先判断参加的等级是否合法,再更新rating
合法则保存最大的答案
如果答案是无穷大,那么在二分时区间变化的只有左端点
在不是无穷大的情况下,再判断是否不可能(因为在无穷大情况下ans也等于-INF)。如果ans == -INF则不可能
最后如果以上两者都不是则输出答案
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <cmath>
using namespace std;
#define cl(a,b) memset(a,b,sizeof(a))
#define pb push_back
#define mp make_pair
#define lowbit(x) (x)&(-x)
typedef long long LL;
typedef pair<int,int> PII;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const int maxn = 200000 + 10;
int n;
int a[maxn],b[maxn];
PII check(int x)
{
for( int i = 0; i < n; i++ ){
if(b[i] == 1 && x < 1900)return mp(1,x);
if(b[i] == 2 && x >= 1900)return mp(2,x);
x += a[i];
}
return mp(0,x);
}
int main()
{
//fin;
while(~scanf("%d",&n)){
for( int i = 0; i < n; i++ ){
scanf("%d%d",a+i,b+i);
}
int ans = -INF,flag = 0;
int l = -20000010,r = 20000010;
while(l <= r){
int mid = (l + r) >> 1;
PII ret = check(mid);
if(ret.first == 1 || ret.first == 0){
if(ret.first == 0)ans = ret.second;
l = mid + 1;
}
else {
flag = 1;
r = mid - 1;
}
}
if(!flag)puts("Infinity");//就是因为这两个判断写反了,最后给判掉了orz..
else if(ans == -INF)puts("Impossible");
else printf("%d\n",ans);
}
return 0;
}
PS:2016年也结束了,成绩不尽人意,来年要更加努力才行。
Good Bye 2016!