hpu 2015-8-8周赛

 

这个是我们学校出得题,不是特别好,但是是一些基础题.

问题 A: 一道签到题

时间限制: 2 Sec   内存限制: 128 MB
提交: 65   解决: 29
[ 提交][ 状态][ 讨论版]

题目描述

我想说这是一道签到题,意思就是本次测试中最水的一道,不过我这样说你真的愿意相信我吗?哈哈,题目是这样的给你一下小数,然后请告诉我分别告诉我这个小数的循环节的循环次数、循环节以及循环节长度

输入

输入包括多组测试数据每组测试数据1行,包括一个小数,小数的长度不超过200,小数大于0小于100

输出

分别输出这个小数的循环节的长度、循环节以及循环次数,中间以一个空格间隔

样例输入

8.6987698769876987
0.666
5.1

样例输出

4 6987 4
1 6 3
1 1 1
#include<stdio.h>
#include<string.h>
char a[220];
char b[220];
int p[220];
int str1;
void kmp()
{
	int i,j;
	i=0;j=-1;
	p[i]=j;
	while(i<str1)
	{
		if(j==-1||b[i]==b[j])
		{
			i++;j++;
			p[i]=j;
		}
		else j=p[j];
	}
}
int main()
{
	while(~scanf("%s",a))
	{
		int i,j;
		i=0;
		while(a[i]!='.')i++;
		for(i=i+1,j=0;a[i];i++,j++)
		b[j]=a[i];
		b[j]='\0';
		str1=strlen(b);
		kmp();
		printf("%d ",str1-p[str1]);
		for(i=p[str1];i<str1;i++)
		printf("%c",b[i]);
		printf(" %d\n",str1/(str1-p[str1]));
	}
	return 0;
}


 

问题 B: MZY寻宝

时间限制: 1 Sec   内存限制: 128 MB
提交: 165   解决: 50
[ 提交][ 状态][ 讨论版]

题目描述

贪心的MZY去一个迷宫寻宝。已知:若MZY在位置(x, y),他下一次只能移动到(x-1, y)、(x+1, y)、(x, y-1)、(x, y+1)四个位置中的任一个(前提不能越界)。
毕竟他不是我,我可以直接飞到宝物那里去。由于MZY比较笨拙,他移动一步需要1分钟。请你帮他算出找到宝物所需要花费的最少时间。

迷宫是一个N*M的地图,图中只有四个数字。
0:此处是空的,可以走
1:此处有障碍,不可以走
2:MZY起点
3:宝物位置(只有一个宝物)

题目保证CZY至少有一条路可以到达宝物位置。

输入

输入数据有多组。

每组以两个整数N和M开始,分别表示迷宫的行数和列数,接下来N行每行有M个数。(1 <= N, M <= 10)

输出

输出MZY找到宝物的最少需要花费的时间。(以秒为单位)

样例输入

2 2
0 2
1 3

样例输出

60

 

#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
int mark[20][20];
int a[20][20];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int ans;
int x1,x2,n,m;
struct note{
	int h,l,step;
	friend bool operator<(note a1,note a2)
	{
		return a1.step>a2.step;
	}
}s,e;
int fun(struct note e)
{
	if(e.h<1||e.h>n||e.l<1||e.l>m||mark[e.h][e.l]||a[e.h][e.l]==1)
	return 0;
	return 1;
}
int dfs(int x,int y)
{
	s.h=x;
	s.l=y;
	s.step=0;
	mark[x][y]=1;
	int i;
	priority_queue<note>q;
    //queue<note>q;
	q.push(s);
	while(!q.empty())
	{
		s=q.top();
		q.pop();
		if(s.h==x1&&s.l==x2)
		return s.step;
		for(int i=0;i<4;i++)
		{
			e.h=s.h+dx[i];
			e.l=s.l+dy[i];
			e.step=s.step+1;
			if(fun(e))
			{
			   if(e.h==x1&&e.l==x2)
		        {
		        	//ans=e.step;
		            return ans=e.step;
		        }
				mark[e.h][e.l]=1;
				q.push(e);
			}
		}
	}
	return 0;
}
int main()
{
	int i,j,x,y;
	while(~scanf("%d%d",&n,&m))
	{
		for(i=1;i<=n;i++)
		{
		for(j=1;j<=m;j++)
		{
			scanf("%d",&a[i][j]);
			if(a[i][j]==2)
			{
				x=i;y=j;
			}
			if(a[i][j]==3)
			{
				x1=i;x2=j;
			}
		}
		}
		memset(mark,0,sizeof(mark));
		ans=0;
	//	dfs(x,y);
		ans=dfs(x,y);
		printf("%d\n",ans*60);
	}
	return 0;
}

问题 C: CZY的组合数烦恼

时间限制: 3 Sec   内存限制: 128 MB
提交: 49   解决: 22
[ 提交][ 状态][ 讨论版]

题目描述

czy最近对组合数产生了浓厚的兴趣,一天他心血来潮,想排n个数字,但是很快他发现种类太多了,于是他决定从中随机找出m个数排,但还是太多了,所以他想请聪明的你写个程序帮助他找到所有种类的排列

输入

输入包括多组测试数据,每组包括一行整数n(1<=n<10),m(1<=m<=n),空格间隔

输出

按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。

样例输入

5 3

样例输出

543
542
541
532
531
521
432
431
421
321
#include<stdio.h>
int n,m;
int a[20],b[20];
void dfs(int k,int x)
{
	if(k>n)
	return ;
	if(x==m)
	{
		for(int i=0;i<m;i++)
		printf("%d",b[i]);
		printf("\n");
		return ;
	}
	for(int i=k;i<=k;i++)
	{
		b[x]=a[k];
		dfs(k+1,x+1);
		dfs(k+1,x);
	}
}
int main()
{
	int i,j;
	while(~scanf("%d%d",&n,&m))
	{
		for(i=n,j=0;i>=1;i--,j++)
		a[j]=i;
		dfs(0,0);
	}
	return 0;
}

 
  
  

问题 D: CZY追女孩

时间限制: 1 Sec   内存限制: 128 MB 提交: 106   解决: 19 [ 提交][ 状态][ 讨论版]

题目描述

CZY遇到了一个萌妹子,他使出浑身解数想要博得她的好感,但是妹子居然是个数学学霸!一天,那个女孩在解数列问题时遇到了一点麻烦,她有数列的前3项,数列不是等比数列就是等差数列,她很想知道这个数列的第n项是什么,但是n可能很大,她算不出来,CZY很想帮她,可是CZY是个学渣,于是想请聪明的你来帮忙求出数列的第n项,由于数据可能太大了,最后的结果对200907取余就好

输入

输入包含多组测试数据,每组测试数据包含4个整数,前三个整数是数列的前三项,最后一个数是n,四个数的范围都是1~10^9

输出

输出这个数列的第n项%200907

样例输入

1 2 3 5
1 2 4 5

样例输出

5
16
 
#include<stdio.h>
int main()
{
	int a,b,c,d,d1,q1,sum,i;
	while(~scanf("%d%d%d%d",&a,&b,&c,&d))
	{
		sum=c%200907;
		if(b-a==c-b)
		{
		  d1=b-a;
		   for(i=3;i<d;i++)
		   {
		   	  sum+=d1%200907;
		   	  sum%=200907;
		   }
		}
		else{
			q1=b/a;
			for(i=3;i<d;i++)
			{
				sum*=q1;
				sum%=200907;
			}
		}
		printf("%d\n",sum);
	}
	return 0;
}

 
  
  

问题 E: 陈公公找女友

时间限制: 1 Sec  内存限制: 128 MB 提交: 57  解决: 20 [ 提交][ 状态][ 讨论版]

题目描述

话说CZY来到了HPU之后,每天对着电脑码代码,码了一学期了,陈公公有一天敲代码敲累了,此刻的陈公公是身心疲惫啊,他突然想:要是有一个Girlfriend多好?于是,陈公公想要在学校找一个Girlfriend。话说在男女比7:1的比例之下很难找到意中人,是不是?可惜这难不倒我们“英(jing)姿(li)飒(feng)爽(fu)”的陈公公,找女友要先买礼物对吧。对于陈公公这种“壕”,当然要买高端大气上档次的啦!陈公公要斥巨资买条钻石手链,送给他心仪已久的女生(从此,陈公公又多了个外号“钻石陈”)。我们都知道手链五颜六色的很吸引人。陈公公也知道女生喜欢颜色比较多的手链,但是手链又不能毫无规律的颜色多而已。我们要买的手链必须是颜色够多,还要有规律,什么叫做有规律?就是有循环的。假如给定参照手链“RGB”,再给一个手链比如“RGBRGBRGB”它包含了3个参照手链。陈公公称包含值为:美丽度。因为包含3个参考串,所以这个手链美丽度就为3.

陈公公想要买一个美丽度大于1的手链,但是又不能只有一种颜色,怎么挑一个最好的呢?这个问题有点难想,并且可惜陈公公对颜色的分辨能力不够高(轻微色盲),不能很好的判断买哪一条手链,要不是陈公公自己都能编程解决这个问题了。陈公公很无奈啊,他想到了有爱心的协会成员,希望求助协会成员,请你帮他选一个最美的手链。这关乎到陈公公能否追到心意的女孩啊!人生大事啊!陈公公说了,能帮他解决这个问题的童鞋,他就会请你吃饭!PS:帮陈公公解决这个问题的人,记得找陈公公请客。

输入

有多组测试数据,输入先给出参考手链(参考手链长度大于1),然后输入一个T(0<T<20),代表陈公公选的T组数据。每组数据第一行是参照手链,第二行是陈公公想知道美丽度的手链(长度不小于参考手链)。由于陈公公比较壕,所以他选的手链的珠子最多可以达到100000。

输出

输出数据也有T行,每行输出,最大美丽度,和相应的手链。如果美丽度相同就输出手链最长的,看下面测试样例。

样例输入

RGB4RGBRGBRGBRGBRGBRGBWRGBWRGBWRGRGBRGGRBGRWW3RWWWWRRWWWWRWRWRWRWWWR5WWRWWWWWRWWRWRWWWWWWWWWRWRWRWRWRRWRWRWWW

样例输出

3 RGBWRGBWRGBW1 RWWWWRW2 WWWRWWRWR

提示

记得找陈公公请吃饭~PS:带上我

 
#include<stdio.h>
#include<string.h>
#define N 110000
char a[N];
char b[22][N];
int p[N];
int cnt[22],k;
int str1,str2[22];
void getp()
{
	int i,j;
	i=0;j=-1;
	p[i]=j;
	while(i<str1)
	{
		if(j==-1||a[i]==a[j])
		{
			i++;j++;
			p[i]=j;
		}
		else j=p[j];
	}
}
void kmp()
{
	getp();
	int i,j;
	i=0;j=0;
	while(i<str2[k])
	{
		if(j==-1||b[k][i]==a[j])
		{
			i++;j++;
			if(j==str1)
			cnt[k]++;
		}
		else j=p[j];
	}
}
int main()
{
	int n,b1;
	while(~scanf("%s",a))
	{
		str1=strlen(a);
		scanf("%d",&n);
		b1=0;
		memset(cnt,0,sizeof(cnt));
		for(k=0;k<n;k++)
		{
			scanf("%s",b[k]);
			str2[k]=strlen(b[k]);
			kmp();
		}
		for(k=1;k<n;k++)
		{
			if(cnt[b1]<cnt[k])
			{
				b1=k;
				
			}
			if(cnt[b1]==cnt[k])
			{
			
				if(str2[b1]<str2[k])
				b1=k;
			}
			
		}
		printf("%d %s\n",cnt[b1],b[b1]);
	    
	}
	return 0;
}

问题 F: CZY的YY难题

时间限制: 1 Sec   内存限制: 128 MB
提交: 9   解决: 2
[ 提交][ 状态][ 讨论版]

题目描述

CZY终于又和萌妹子的关系又进了一步,终于知道了妹子的名字,原来她叫YY,CZY跟着那个女孩也学到了很多的数学知识,CZY感觉自己快要超神了,于是嘚瑟起来,YY对此不屑一顾,冷笑一声“呵呵”后,便给CZY出了一道数学题,YY给了CZY一个数n,又给了m个数,让他从中找一些数,让这些数的和等于n,并让他把所有的情况写出来。这下可把CZY给打击到了,于是他又来请教聪明的你,请你帮帮他

输入

题目包含多组测试数据,每组测试数据包含两行,第一行包含两个整数n,m(1<=n,m<1000)

第二行包含m个数

输出

按从大到小的顺序输出所有符合的情况,没有符合的情况就输出NONE

样例输入

4 6
4 3 2 2 1 1
5 3
2 1 1
400 12
50 50 50 50 50 50 25 25 25 25 25 25

样例输出

4
3+1
2+2
2+1+1
NONE
50+50+50+50+50+50+25+25+25+25
50+50+50+50+50+25+25+25+25+25+25
 
#include<stdio.h>
#include<cstring>
#include<algorithm>  
using namespace std;
int a[1100],n,m,b[1100];
int flag,flag1;
int cmp(int a,int b)
{
	return a>b;
}
void dfs(int x,int sum,int k)
{
//	if(sum>n||x>=m)
//	return ;
	if(sum==n)
	{
		flag1=1;
		for(int i=0;i<k-1;i++)
		   printf("%d+",b[i]);
		printf("%d\n",b[k-1]);
		return ;
	}
	   if(sum>n||x>=m)
	    return ;
        b[k]=a[x];
		dfs(x+1,sum+b[k],k+1);
	//	dfs(x+1,sum,k);
		while(a[x]==a[x+1])
		x++;
		dfs(x+1,sum,k);
}
int main()
{
	int i;
	while(~scanf("%d%d",&n,&m))
	{
		for(i=0;i<m;i++)
		{
			scanf("%d",&a[i]);
		}
		flag1=0;
		memset(b,0,sizeof(b));
		sort(a,a+m,cmp);
		dfs(0,0,0);
		if(flag1==0)
		printf("NONE\n");
	}
	return 0;
}

 
     
     

问题 G: 打败魔王

时间限制: 2 Sec   内存限制: 128 MB 提交: 43   解决: 6 [ 提交][ 状态][ 讨论版]

题目描述

可怜的公主又被魔王抓走了。魔王这次准备在T时刻与公主成亲,不过公主深信智勇的骑士CZY肯定能将她救出。 已知:公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。 CZY一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那CZY就会被撞死。 CZY在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。

输入

输入有多组测试数据。 每个测试数据的前一行有三个整数N,M,T。 N,M迷宫的大小N*M(1 <= N,M <=10)。T如上所意。 接下去的前N*M表示迷宫的第一层的布置情况,后N*M表示迷宫第二层的布置情况。

输出

如果CZY能够在T时刻能找到公主就输出“YES”,否则输出“NO”。

样例输入

1 4 2
.#.#

*.#P

样例输出

NO
 
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std; 
int n,m,tem;
char a[5][15][15],b[5][15][15];
int vis[5][15][15];
struct note{
	int c,h,l,time;
	friend bool operator<(note a1,note a2)
	{
		return a1.time>a2.time; 
	}
}s,k;
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};
int fun(struct note k)
{
	if(k.h<1||k.h>n||k.l<1||k.l>m||vis[k.c][k.h][k.l]||a[k.c][k.h][k.l]=='*')
	return 0;
	return 1;
}
void bfs(int x,int y,int t)
{
	s.c=x;
	s.h=y;
	s.l=t;
	s.time=0;
	vis[x][y][t]=1;
	priority_queue<note>q;
	q.push(s);
	while(!q.empty())
	{
		s=q.top();
		q.pop();
		if(a[s.c][s.h][s.l]=='P'&&s.time<=tem)
		{
			printf("YES\n");
			return ;
		}
		for(int i=0;i<4;i++)
		{
			//k.c=s.c;
			k.h=s.h+dx[i];
			k.l=s.l+dy[i];
			k.time=s.time+1;
			if(a[k.c][k.h][k.l]=='#')
			{
				if(s.c==1) k.c=s.c+1;
				else k.c=s.c-1;
			}else k.c=s.c;
			if(fun(k))
			{
				vis[k.c][k.h][k.l]=1;
				q.push(k);
			}
		}
	}
	printf("NO\n");
}
int main()
{
	int i,j;
	while(~scanf("%d%d%d",&n,&m,&tem))
	{
		memset(vis,0,sizeof(vis));
		for(i=1;i<=n;i++)
		{
			getchar();
			for(j=1;j<=m;j++)
			scanf("%c",&a[1][i][j]);
		}
		for(i=1;i<=n;i++)
		{
			getchar();
			for(j=1;j<=m;j++)
			scanf("%c",&a[2][i][j]);
		}
		bfs(1,1,1);
	}
	return 0;
}

 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值