首先呢,要废话一段。。这场是见过的所有多校中最最亲民的。因为英文题面都很短。但是是最考验智商的一次(除去那个化学第一电离能)。。。
赛后补题在题解和各大巨巨的帮助下能够补到7题也是醉了。说明题就是考模型建立,没有考到多深的知识点。
1002:HDOJ 5344
第一眼看上去就是亦或啊,又是数学啊,又是不能暴力的。the xor of all (Ai+Aj)(1≤i,j≤n)这是关键句。根据题意把需要的写出来,发现所有i!=j的,都可以利用a^a=0消除,所有只剩下i==j的。最后答案就是(2*a1)^(2*a2)^(2*a3)^.....(2*an)
代码(不要开数组保存ai):
while(t--){ scanf("%I64d%I64d%I64d%I64d",&n,&m,&z,&l); a=ans=0; while(n--){ ans=ans^(2*a); a=(a*m+z)%l; } printf("%I64d\n",ans); }
1005:HDOJ 5347
这题网上的评论一大堆,我只想说:如果出在现场赛,没有百度没有谷歌没有维基,有多少大学生还记得第一电离能是个什么鬼啊。。。。。
顺便让大学理科狗回忆回忆高三时光:第一电离能
重要的是里面那张图片说明了很多特征,归纳如下:
1.同周期的序号越大第一电离能越大
2.同一族的序号越小第一电离能越大
3.在图中明显的4个需要特判的,B,O,Al,S。。。
细节题用各种if语句就好了:
int a,b; int Min,Max; int num[]={8,18,32,16,26,36,50,34,44,68,52,76,84}; bool check(int x){ for(int i=0;i<=12;i++) if (num[i]==x) return true; return false; } int main(){ //input; while(scanf("%d%d",&a,&b)!=EOF){ Min=min(a,b); Max=max(a,b); if (Max==5&&Min==4){ if (a==4) puts("FIRST BIGGER"); else puts("SECOND BIGGER"); } else if (Max==8&&Min==7){ if (a==7) puts("FIRST BIGGER"); else puts("SECOND BIGGER"); } else if (Max==13&&Min==12){ if (a==12) puts("FIRST BIGGER"); else puts("SECOND BIGGER"); } else if (Max==16&&Min==15){ if (a==15) puts("FIRST BIGGER"); else puts("SECOND BIGGER"); } else if (check(Max-Min)){ if (a==Min) puts("FIRST BIGGER"); else puts("SECOND BIGGER"); } else{ if (b==Min) puts("FIRST BIGGER"); else puts("SECOND BIGGER"); } } return 0; }
1007:HDOJ 5349
simple problem确实简单,看了题解没什么要说的。。。。。。
PS:还是得学习学习各种自创的和STL中的数据结构,根据题目意思来做
int main(){ //input; while(scanf("%d",&n)!=EOF){ len=0; maxnum=-1*INF; for(i=1;i<=n;i++){ scanf("%d",&j); if (j==1){ scanf("%d",&k); len++; maxnum=max(maxnum,k); } else if (j==2){ if (len){ len--; if (!len) maxnum=-1*INF; } } else if (j==3){ if (len) printf("%d\n",maxnum); else printf("0\n"); } } } return 0; }
1008:HDOJ 5350
典型的智商题,如果直接告诉你是个huffman全场肯定不止几个强队AC的。。。。智商还是比水平更加重要,分辨难题和水题靠的是细节和智商。。。
这个题的题面把huffman隐藏的很深,不过呢,,,从取较小可以看出DP的思想。。。。结果。。。。。就证明了
利用STL的优先队列实现:
priority_queue<int,vector<int>,greater<int> > que; int t,n,i,j,k; __int64 ans; int main(){ //input; scanf("%d",&t); while(t--){ scanf("%d",&n); while(!que.empty()) que.pop(); for(i=1;i<=n;i++){ scanf("%d",&j); que.push(j); } ans=0; while(n>1){ i=que.top();que.pop(); j=que.top();que.pop(); k=i+j; ans+=k; que.push(k); n--; } printf("%I64d\n",ans); } return 0; }
1009数学题+大数:用Java更方便。。什么都不想,结论比赛的时候是需要有个强力数学队友来帮忙的
大数是需要风格需要模板的:
import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String args[]){ BigInteger Mod=BigInteger.valueOf(258280327); BigInteger[] big; big=new BigInteger[2000]; big[1]=BigInteger.valueOf(1); big[2]=BigInteger.valueOf(1); for(int i=3;i<=1000;i++) big[i]=big[i-1].add(big[i-2]); int t; BigInteger m; Scanner reader=new Scanner(System.in); t=reader.nextInt(); for(int Case=1;Case<=t;Case++){ m=reader.nextBigInteger(); m=reader.nextBigInteger(); int i,j; for(i=1;i<=1000;i++){ j=big[i].compareTo(m.add(BigInteger.valueOf(1))); if (j>0) break; } System.out.println((m.subtract(big[i-2])).mod(Mod)); } reader.close(); } }
剩下两题感谢我的女神罗茜巨巨
1006:HDOJ 5348
1010:HDOJ 5352
每次写完还是要废话的:
1.看题还是要仔细。说不定别人觉得麻烦,你看懂了里面的套路就知道是个水题
2.数学还是很重要的
3.Java大数很有用
版权声明:本文为博主原创文章,未经博主允许不得转载。