题意: 一个CF玩家打CF 给出其比赛列表和上分(掉分)情况 ,但是没给初始分 问最后最高分是多少 (情况不存在,或者可能无穷大)
思路: 设初始分为x 那么之前的回合的分数前缀和为sum 如果当前为div2 则有 x+sum<=1899 如果为div1 x+sum>=1900 求出上下界
答案为 x(上界)+ 最后的sum 如果下界大于上界则不存在 如果上界无穷则 分数可以无穷大
1 #include <bits/stdc++.h> 2 3 const int inf=0x3f3f3f3f; 4 #define int long long 5 using namespace std; 6 const int maxn=2e5+10; 7 int c[maxn],d[maxn]; 8 int32_t main(){ 9 int n; 10 scanf("%lld",&n); 11 for(int i=1;i<=n;i++){ 12 scanf("%lld%lld",&c[i],&d[i]); 13 } 14 15 int xiajie=-inf,shangjie=inf; 16 long long sum=0; 17 for(int i=1;i<=n;i++){ 18 if(d[i]==1){ 19 xiajie=max(1ll*xiajie,1900-sum); 20 } 21 if(d[i]==2){ 22 shangjie=min(1899-sum,1ll*shangjie); 23 } 24 // cout<<i<<" "<<shangjie<<" "<<xiajie<<" "<<sum<<endl; 25 sum+=c[i]; 26 } 27 28 if(xiajie>shangjie)printf("Impossible\n"); 29 else if(shangjie==inf){ 30 printf("Infinity\n"); 31 } 32 else { 33 printf("%lld\n",shangjie+sum); 34 } 35 36 37 return 0; 38 }View Code