首先呢,要废话一段。。这场是见过的所有多校中最最亲民的。因为英文题面都很短。但是是最考验智商的一次(除去那个化学第一电离能)。。。
赛后补题在题解和各大巨巨的帮助下能够补到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大数很有用