题目大意:每个codeforces的user都有个分数,分为两个等级,第一等级是>=1900,第二个等级是<1900。给出每次比赛前的等级和比赛后所提升或下降的分数,让你输出最后的分数,不可能输出impossible。可以是正无穷的话Infinity,否则输出可能的最大分数。
参考博客
真的很佩服写这个博客的人,思维很强。我模拟啊枚举啊弄了半天,分情况分的自己都有点分不清了,还不能AC。但别人思考过后,很容易就能过。
题解:建立两个边界(一个上边界,一个下边界),从第一条开始模拟,根据条件缩小边界,到最后如果最大边界不确定就是正无穷,左边界大于有边界就是不可能,否则输出边界中的最大值。
自己体会一下,有点不好解释。codeforces里面可以看到样例,找几个特殊和一般的模拟一下就会有点感觉了。
#include <bits/stdc++.h> //包含所有头文件,codeforces支持,hdu有的题目支持,poj不支持
using namespace std;
const int INF = 0x3f3f3f3f; //这个数不错,既能保证接近一般数据里的无穷,也能保证经过一些运算后不爆int
int main()
{
int n,l,r,a,b,ans;
while(~scanf("%d",&n))
{
l=-INF,r=INF;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a,&b);
if(b==1&&l<1900) l=1900; //此时位于1等级,其结果下界必定不小于1900,更新下界
if(b==2&&r>1899) r=1899; //此时位于2等级,其结果上界必定不大于1899,更新上界
l+=a;
r+=a;
}
ans = max(l,r);
if(r<l) printf("Impossible\n");
else if(ans>20001899) printf("Infinity\n");//20001899是数据所能达到的最大值,自己想一想,很容易
else printf("%d\n",ans);
}
return 0;
}
没想到这题思维过后这么简单,之前写了很长一串,很佩服原博主能想出来这种方法。