郑大校赛

总结:水平太菜;

Problem B: make pair

Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 53  Solved: 40
SubmitStatusWeb Board

Description

pair<T,T>是c++标准模板库中一种十分有用的模板类型,它是一个二元组。我们可以用它来表示一个二维坐标点,人的身高体重等等。make_pair()函数可以方便地构造一个pair。

现在有一个长度为n的整数数组a1~an(可以存在相同的元素),将每两个元素(包括自身)make_pair(),一定能得到n2个pair。例如,[1,2,3]make_pair()后,将得到{[1,1],[1,2],[1,3], [2,1],[2,2],[2,3], [3,1],[3,2],[3,3]}。

问题是这样的,在构造出了n2个pair后,升序排序(先按第一维排序,若第一维相等,再按第二维排序),你能找到排序后的第k个元素吗?

Input

多组数据。

第一行,2个整数n和k (1<=n<=10000,1<=k<=n^2)。

第二行,n个整数,即原数组a1~an(1<=ai<=1000000000)。

Output

对于每组数据,输出两个整数,排序后的第k个pair。

Sample Input

2 4 2 1 3 2 3 1 5

Sample Output

2 2 1 3

HINT

题解:水

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
using namespace std;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
typedef long long LL;
#define mem(x,y) memset(x,y,sizeof(x))
#define PI(x) printf("%d",x)
#define PL(x) printf("%lld",x)
#define SI(x) scanf("%d",&x)
#define SL(x) scanf("%lld",&x)
#define P_ printf(" ")
#define T_T while(T--)
const int MAXN=10010;
int m[MAXN];
int main(){
	int n,k;
	while(~scanf("%d%d",&n,&k)){
		for(int i=0;i<n;i++)SI(m[i]);
		sort(m,m+n);
		printf("%d %d\n",m[(k-1)/n],m[(k-1)%n]);
	}
	return 0;
}

Problem C: water problem II

Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 80  Solved: 49
SubmitStatusWeb Board

Description

相信大家对A+B问题最熟悉了。

实验室有个女人(传说中的潘同学)经常卡在这种题目上。。。

有一次,他边敷着面膜边做题,遇见了这样一个题目:

输入两个表示数的英文单词,输出他们的和。(当然输入的是英文,输出的是10进制数)

他头脑太ben了,想了半天没想出来怎么做?你能帮助他么?

Input

多组输入数据。每组数据输入两个表示数的英文单词(输入的数据是0-9)

Output

对于每组数据输出一个和。

Sample Input

one two

Sample Output

3

题解:a+b

代码:

#include<stdio.h>
#include<string.h>
int judge(char s[10])
{
	if(strcmp("zero",s)==0)return 0;
	if(strcmp(s,"one")==0)
	return 1;
	else if(strcmp(s,"two")==0)
	return 2;
		else if(strcmp(s,"three")==0)
	return 3;
		else if(strcmp(s,"four")==0)
	return 4;
		else if(strcmp(s,"five")==0)
	return 5;
		else if(strcmp(s,"six")==0)
	return 6;
		else if(strcmp(s,"seven")==0)
	return 7;
		else if(strcmp(s,"eight")==0)
	return 8;
		else if(strcmp(s,"nine")==0) return 9;
}
int main()
{
	int a,b;
	char s1[10],s2[10];
	while(scanf("%s%s",s1,s2)!=EOF)
	{

		a=judge(s1);
		b=judge(s2);
		printf("%d\n",a+b);
	}
	return 0;
}

  

Problem E: sort

Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 125  Solved: 20
SubmitStatusWeb Board

Description

想必大家对排序已经很熟悉了,但是spy好像对排序不太熟悉,有一天,他看到这样一个关于排序的题目:

对于 k 个用空格分隔开的整数,依次为 n1, n2 … nk。请将所有下标不能被 3 但可以被 2 整除的数在这些数字原有的位置上进行升序排列,此外,将余下下标能被 3 整除的数在这些数字原有的位置上进行降序排列。

spy想了半天不知道怎么排序,你可以帮助他么?

Input

多组数据,每组数据一行,为k个小于1000的正整数,依次为 n1, n2 … nk。(1 <= k <= 100000)

Output

对于每组数据,输出排序后的结果。

Sample Input

1 3 4 2 10 6 8

Sample Output

1 2 6 3 10 4 8

HINT

题解:暴力可以过;

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
using namespace std;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
typedef long long LL;
#define mem(x,y) memset(x,y,sizeof(x))
#define PI(x) printf("%d",x)
#define PL(x) printf("%lld",x)
#define SI(x) scanf("%d",&x)
#define SL(x) scanf("%lld",&x)
#define P_ printf(" ")
#define T_T while(T--)
const int MAXN=100010;
int m[MAXN],a[MAXN],b[MAXN];
int cmp(int a,int b){
	return a>b;
}
int main(){
	int k=0,k1=0,k2=0;
	char c;
	while(~scanf("%d",&m[k++])){
		c=getchar();
		if(c==‘ ‘)continue;
		else{
			for(int i=1;i<=k;i++){
				if(i%2==0&&i%3!=0)a[k1++]=m[i-1];
				else if(i%3==0)b[k2++]=m[i-1];
			}
			sort(a,a+k1);sort(b,b+k2,cmp);
			int flot=0;
			int a_i=0,b_i=0;
			for(int i=1;i<=k;i++){
				if(flot)P_;flot++;
				if(i%2==0&&i%3!=0)
					PI(a[a_i++]);
				else if(i%3==0)PI(b[b_i++]);
				else PI(m[i-1]);
			}
			puts("");
			k=0;k1=0;k2=0;
		}
	}
	return 0;
}

  

Problem H: easy problem

Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 90  Solved: 43
SubmitStatusWeb Board

Description

给你一个数字N,N的范围是1~1000000,求一个最小的正整数M,这个数字M的各个位的数字加上它本身之和恰好为N。当然,如果没有解,输出0。

Input

输入数据由多组数据组成,每行由一个数字N组成(1<=N<=1000000)。

Output

对于每组数据,输出仅一行包含一个整数M。如果对于每个N,存在最小的M,则输出这个最小值。如果不存在这个最小的M,则输出0。

Sample Input

216 121 2005

Sample Output

198 0 1979

HINT

题解:也是暴力,刚开始超时了几次,最后想想不需要从1开始,因为各个位数字只和肯定小于9*6;直接从N-9*6开始就好了;

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
using namespace std;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
typedef long long LL;
#define mem(x,y) memset(x,y,sizeof(x))
#define PI(x) printf("%d",x)
#define PL(x) printf("%lld",x)
#define SI(x) scanf("%d",&x)
#define SL(x) scanf("%lld",&x)
#define P_ printf(" ")
#define T_T while(T--)

int main(){
	int N;
	while(~scanf("%d",&N)){
		int flot=0;
		int x,temp;
		for(int i=N-60;i<=N;i++){
			x=i;temp=0;
			while(x){
				temp+=x%10;
				x/=10;
			}
			if(i+temp==N){
				printf("%d\n",i);
				flot=1;
				break;
			}
		}
		if(!flot){
			puts("0");
		}
	}
	return 0;
}

  

1817: match number

Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 89  Solved: 39
SubmitStatusWeb Board

Description

喜欢写程序的同学一般对数字较为敏感。对于一串长度为2*n的号码,我们认为如果它符合以下条件,就是匹配的:

把这个号码分为左右两半部分,长度均为n。对于左半部分的每一位数,右半部分都存在一位严格大于它的数;或者对于左半部分的每一位数,右半部分都存在一位严格小于它的数。注意,右半部分的每一位必须对应左半部分的某一位,也就是每一位数只能“使用”一次。

给出一个号码,你能判断它是否是匹配的吗?

Input

多组数据。

第一行,1个整数n(n<1000)。

第二行,一串长度为2*n的号码,由‘0‘~‘9‘组成。

Output

对于每组数据,如果号码是匹配的,输出"YES",否则输出"NO"(引号不输出)。

Sample Input

2 2421 2 0135 2 3754

Sample Output

YES YES NO

HINT

题解:不知道为啥要初始化,不初始化就会wa;

代码;

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
using namespace std;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
typedef long long LL;
#define mem(x,y) memset(x,y,sizeof(x))
#define PI(x) printf("%d",x)
#define PL(x) printf("%lld",x)
#define SI(x) scanf("%d",&x)
#define SL(x) scanf("%lld",&x)
#define P_ printf(" ")
#define T_T while(T--)
const int MAXN=2020;
char s[MAXN];
int n;
/*int cmp(int a,int b){
	if(a<=b)return 1;
	else return 0;
}*/
int a[MAXN],b[MAXN];
bool js(int tf){
	//for(int i=0;i<n;i++)printf("%d",a[i]);puts("");
//	for(int i=0;i<n;i++)printf("%d",b[i]);puts("");
	if(tf){
		for(int i=0;i<n;i++){
			if(a[i]>=b[i])return false;
		}
		return true;
	}
	else{
		for(int i=0;i<n;i++){
			if(a[i]<=b[i])return false;
		}
		return true;
	}
}
int main(){
	while(~scanf("%d",&n)){
		mem(a,0);mem(b,0);
		scanf("%s",s);
		for(int i=0,j=n;i<n;i++,j++)a[i]=s[i]-‘0‘,b[i]=s[j]-‘0‘;
		sort(a,a+n);
		sort(b,b+n);
		int tf;
		if(a[0]<b[0])tf=1;
		else tf=0;
		if(js(tf))puts("YES");
		else puts("NO");
	}
	return 0;
}

  

1819: 加加加!(油)

Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 59  Solved: 37
SubmitStatusWeb Board

Description

实验室的小D同学又开始玩游戏了,这次他的游戏貌似很高级的样子。首先他在一张纸上写下了一个数n,然后他在两个无差别的球上写上两个数分别是a和b,他把两个球放在一个黑色的袋子中,然后他会从袋子中随机取出来一个球,并将这个n改变成n和这个球上标记的数的和。

是不是很简单!是不是很有意思!是不是很神奇!

(不是!)

好吧,这不是问题的所在,问题的所在是小d这个过程中n都有可能是些什么值。

Input

输入的第一行包含一个K,代表输入样例组数。

每组样例只有一行,包含四个整数"n a b m",n,a,b的含义为题目描述中的含义,m代表小D随机从袋子中取球的次数。(0 <= n < 1000000,0 <= a < 100000,0 <= b < 100000, 0 <=m < 10)

Output

把所有可能出现的n按照升序输出(不允许重复)。注意只有两个连续的数中间才允许空格,结尾不允许有空格。

Sample Input

3 1 1 1 1 4 2 3 2 5 100 102 1

Sample Output

1 2 4 6 7 8 9 10 5 105 107

暴力水过。。。

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
using namespace std;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
typedef long long LL;
#define mem(x,y) memset(x,y,sizeof(x))
#define PI(x) printf("%d",x)
#define PL(x) printf("%lld",x)
#define SI(x) scanf("%d",&x)
#define SL(x) scanf("%lld",&x)
#define P_ printf(" ")
#define T_T while(T--)
int c[2][5000],ans[5000];
int main(){
	int T,n,a,b,m;
	SI(T);
	T_T{
		scanf("%d%d%d%d",&n,&a,&b,&m);
		int cur=0;
		int k=0,pol=1;
		c[0][0]=n;
		ans[0]=n;
		while(m--){
			cur^=1;
			for(int i=0;i<pol;i++){
				c[cur][i<<1]=c[cur^1][i]+a;
				ans[++k]=c[cur][i<<1];
				c[cur][i<<1|1]=c[cur^1][i]+b;
				ans[++k]=c[cur][i<<1|1];
			}
			pol<<=1;
		}
		sort(ans,ans+k+1);
			k=unique(ans,ans+k+1)-ans;
		for(int i=0;i<k;i++){
			if(i)printf(" ");
			printf("%d",ans[i]);
		}puts("");
	}
	return 0;
}

  

时间: 2024-10-29 00:27:41

郑大校赛的相关文章

2014东北农大校赛--D.Cross the middle (任意两点最短路径 Floyd)

Cross the middle Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 36  Solved: 13 [Submit][Status][Web Board] Description n个点的图,给出任意两点之间的距离,m个询问,每次询问Mid是否可能出现在从Start到End的最短路径上. Input 第一行n,m 接下来是一个n*n的邻接矩阵,w[i][j]表示i到j的距离 接下来m行 每行start,end,mid N,m<=100,

2014东北农大校赛--A. Paint it! (预处理)

1141: A.Paint it! Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 13  Solved: 10 [Submit][Status][Web Board] Description 有一个n*m的棋盘,每个格子只可能是黑和白两种颜色,你可以使用染料将某个格子染成黑色或者白色.求最少需要染多少个格子, 能使当前的棋盘变成类似于国际象棋的棋盘(每个格子临边的四个格子颜色都不与该格子的颜色相同). Input n m(n,m<=100) 接下

2014工大校赛题目以及解

a,b题不说. c题思路是每次枚举俩个点,用半径R确定最大的圆(这样的圆有俩个,求圆心手算有点小麻烦),更新最大值,3次方的,100个点,不会超时. D题是枚举+贪心,所有物品一共只能是N+1种被拿的情况:要么全是用R(该位子是若用右手标记R,若用左手标记L):RRR...RRR,或者第一个物品用L:LRRR...RR,.....依次到LLLLLL..LLL,一个序列来记录每个物品是被左手还是右手拿.枚举所有序列,如LLL...RRR,贪心:那必然是一次L一次R,多出来的需要额外开销能量.如LL

川大/电子科大校赛

第一次出校比赛 比赛时间: 电子科技大学校赛:2015.4.4 周六 四川大学校赛:2015.4.6 周一 之前本以为可以愉快地正大光明地不上课出去玩玩,不过后来才发现正值清明节,好像亏了,并不能好好滴玩耍,不过少上了4节课也是不错的,哈哈. 4.3 上午11点从学校出发,坐27路公交到圣水寺转车,然而发现时间并不多了,于是打车赶到火车站,无奈排队取票和进站的人都多得不行,看来之前小框框建议早点走是极为明智的,毕竟假期,无形甩锅....好不容易取到票出来但是进站的队伍又好长好长,只有10分钟点车

squee_spoon and his Cube VI---郑大校赛(求最长子串)

市面上最常见的魔方,是三阶魔方,英文名为Rubik's Cube,以魔方的发明者鲁比克教授的名字命名.另外,二阶魔方叫Pocket Cube,它只有2*2*2个角块,通常也就比较小:四阶魔方叫Revenge Cube,这是因为就算你好不容易复原了三阶魔方,四阶魔方也会向你“复仇”:而五阶魔方叫Professor Cube,人们认为只有专家才能够复原这么复杂的魔方. 作为ACM(A Cube Master),squee_spoon准备为九阶正十二面体魔方命名,此时他的脑中浮现出一个长长的字符串S,

杭师大校赛总结

感想: 这次校赛总有些遗憾,有两道题目我总觉得可以做出来,但是却又没做出来, 一个是没有将以前做过的题目的规律总结,就是没有好好的整理以前的知识点, 还有就是做题的速度太慢了,H题到了最后才想出一个新的点子,还没来得及实现比赛就结束了. 总的来说,我觉得比赛就是考察5个方面,速度,细节,模板(可能不太常用),语言(包括C++)和配合, 只要抓住这几个方面就好了,就我而言,还要提高速度,注重细节,不断总结,完善自己的模板. 相信下一次我一定能够A更多的题. 原文地址:https://www.cnb

2019武科大校赛游记

我佛了,刚刚登博客用户名密码一起出锅,还好我机智尝试多次爬了进来. 这次的校赛纯属意外,本来这段时间的计划只不过是好好弄弄紫书上的题,结果看见Google赞助就脑子不拎清报名了,报名过程依旧很曲折,但我不想多说,总之就是随便找了个同学一起去玩了,由于没有前期磨合,甚至两个人完全不熟,所以最后很惨ORZ. 开局我们就很顺利找到了M是签到,然后光速过了.接着队友信誓旦旦和我说有一道是矩阵快速幂,然后我找了板子他去写...好像一个小时里T了无数次...在他自闭的时候我看出I是一道可做的,把三种情况和公

2017北大校赛 J题 pairs

题目链接 http://poj.openjudge.cn/practice/C17J/ orz 原来是一道无脑枚举题目 只是很卡常数而已 复杂度算错也是很醉orz 当时怎么没想着优化常数呢 题解:枚举x,p,y,就可以了 当然,普通暴力枚举肯定会超时,复杂度是M^1.5 (一开始算的是M^1.5logM,实际上算错了,因为M + M/4 + M/9 + .... 不超过2*M) 我们考虑预处理一些部分,其实就是预处理出每个数i的小于sqrt(i)的所有约数 这个复杂度实际上是MlogM 之后我们

师大校赛D coloring Game 并查集

这题说的是 在一个 森林中 两个人在这棵树上涂颜色,黑色或者白色,第一次只能在1 号节点上涂色 第二次 只能在2上涂,以此类推, 在每个节点上只能涂黑色或者白色,并且相邻的点不能有相同的颜色,最后求不能填的人就输了. 每个点周围的比他小的点 都会有一个祖先(或者是他们自己),我们知道他周围的点的祖先中最小的那个点 一定是影响他的最小的点 那么他取什么值这就不那么重要了.无论他取黑还是白,后面的就只是相对而言,那么如果他受到第二小或者以上的点的影响,那么他就一定不能了, 还有就是当他和他周围点离他