被这个题坑了一下午,感觉很水,一直WA在第14组,我那个气啊,结束后发现第14组有点小争议,于是找出题人解释,然后出题人甩给了我一段原文:Masha writes all progression terms one by one onto the board (including repetitive) while condition |bi| ≤ l is satisfied 嗯,看仔细看题很重要!
题意:给出你一个等比数列的首项和公比,然后给出一个范围l和n个数,求这个等比数列绝对值在这个范围内且不在这n个数中出现的有多少个,注意等比数列是一项一项写出的,当有某一项的绝对值不在这个范围内立即跳出。
思路:感觉是很简单的暴力模拟,然后无限WA,直接特判了公比为0、1、-1的情况,还是WA,看了后台才知道开始就应该特判首项与l的关系。//代码写的好丑啊,简直无法言说。
int main(){ int m; ll b,q,l; while(~scanf("%I64d%I64d%I64d%d",&b,&q,&l,&m)) { mapq1; ll x,r=l; l=-l; for(int i=0; i r){ puts("0");continue;} if(b==0) { if(q1[0]) puts("0"); else puts("inf"); continue; } int ans=0; if(q==0)//公比为0 { if(b==0)//全部为0 { if(q1[0]) puts("0"); else puts("inf"); } else//b不为0 { if(!q1[0]) puts("inf"); else { if(q1[b]||b r) puts("0"); else puts("1"); } } } else if(q==1) { if(q1[b]||b r) puts("0"); else puts("inf"); } else if(q==-1) { ans=2; if(q1[b]||b r) ans--; b=-b; if(q1[b]||b r) ans--; if(ans) puts("inf"); else puts("0"); } else //不会出现重复的 { ans=0; for(int i=1;; i++) { if(b>=l&&b<=r) { if(!q1[b]) ans++; } else break; if(b<-INF||b>INF) break; b*=q; } printf("%d\n",ans); } } return 0;}
这个C倒是很有意思的一道题,求子序列最大和。
题意:由题目所给的公式可以看出来,所有前后项的差的绝对值构成一个数列,然后选取一项作为起点第一项,奇数项加,偶数项减,选取的起点会影响加减符号。求最大值。
思路:做过连续最大和一眼就能看出本题关键,我们先预处理出这个差的绝对值序列,因为任意一项可加可减,具体看你选取的首项位置,所以我们先把所有的偶数项用来减,也就是偶数项都乘以-1,然后求一遍连续最大和,然后所有数都乘以-1,就反过来了,再求一遍连续最大和。答案就是过程中的最大值。
ll a[N];int main(){ int n; while(~scanf("%d",&n)) { for(int i=0; i=0) tmp+=a[i]; else tmp=a[i]; ans=max(ans,tmp); } tmp=0; for(int i=0;i =0) tmp+=a[i]; else tmp=a[i]; ans=max(ans,tmp); } printf("%I64d\n",ans); } return 0;}
挺经典的一个题,对连续最大和有疑问可以做做:
(买一送一 http://acm.nyist.net/JudgeOnline/problem.php?pid=1320)
加强版: