版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Lngxling/article/details/82179526
题意:
大于等于1900分的是第一梯队,小于等于1899的是第二梯队,给出n次分数的变化和变化前所处的梯队,问是不是合理的,如果是合理的,输出最后最高的可能分数,无限大输出 Infinity
思路:
分数的变化相当于一个折线图,如果我们把开始点看做0的话,要想让最终结果最大,就需要把折线图上移,最多上移到二梯队的最高点在1899处。
如果所有的分数都在一梯队,最高就是无限,如果一梯队的最低分数小于二梯队的最高分数,就是不合理
所以需要维护出一梯队的最低分数和二梯队的最高分数及其位置,然后分情况讨论
#include <bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
int n;
int sco[200100],di[200100];
int main()
{
scanf("%d",&n);
int f1=1,f2=1;
int ans=0;
int maxx=-inf;
int minn=inf;
int k;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&sco[i],&di[i]);
if(di[i]==1)
f2=0;
if(di[i]==2)
f1=0;
if(di[i]==1)
{
if(ans<minn)
minn=ans;
}
if(di[i]==2)
{
if(ans>maxx)
{
maxx=ans;
k=i;
}
}
ans+=sco[i];
}
if(minn<=maxx)
{
printf("Impossible\n");
return 0;
}
if(f1)
{
printf("Infinity\n");
return 0;
}
int num=1899;
for(int i=k;i<=n;i++)
{
num+=sco[i];
}
printf("%d\n",num);
}