2015多校训练5题解与代码

首先呢,要废话一段。。这场是见过的所有多校中最最亲民的。因为英文题面都很短。但是是最考验智商的一次(除去那个化学第一电离能)。。。

赛后补题在题解和各大巨巨的帮助下能够补到7题也是醉了。说明题就是考模型建立,没有考到多深的知识点。


戳我见官方题解


1002:HDOJ 5344

第一眼看上去就是亦或啊,又是数学啊,又是不能暴力的。the xor of all ( Ai + Aj )( 1i,jn )这是关键句。根据题意把需要的写出来,发现所有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大数很有用

你可能感兴趣的:(ACM)