2010 辽宁省赛

1.dinner

题目地址:http://192.168.49.228/problem.php?cid=1018&pid=0

题目大意:给你一个数n,后有n个字符串,问字符串中是否含有bowl, knife, fork and chopsticks.这四个单词,

如果存在就输出。

#include<stdio.h>
#include<string.h>
char s[4][30]={"bowl" ,"knife","fork","chopsticks"};
char a[30];
int main()
{
	int i,j,flag,n;
	while(scanf("%d",&n)!=EOF){
		
		flag=0;
		
		for(i=0;i<n;i++){
			scanf("%s",a);
			for(j=0;j<4;j++){
				if(strcmp(a,s[j])==0){
					if(flag==0){
						printf("%s",a);
						flag=1;
					}
					else
						printf(" %s",a);
					break;
				}
			}
		}
		printf("\n");
	}
	
	return 0;
 } 

2.You are my brother

题目地址http://192.168.49.228/problem.php?cid=1018&pid=1

题目大意:有 1,2 两个人,他们是一个家族的,让你确认他们的辈分关系。如果2比1大,输出You are my elder

2比1小,输出You are my younger,1,和2辈分相同输出You are my brother。

使用并查集,连接辈分结构,再使用队列,求他们分别到根节点之间有多少人

#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
int a[2010];
int findd(int t)
{
	if(t==a[t])
		return t;
	return a[t]=findd(a[t]);
}
void join(int u,int v)
{
	u=findd(u);
	v=findd(v);
	if(u!=v)
		a[u]=v;
}
int main()
{
	int i,n,countt1,countt2,temp,u,v,node;
	
	while(scanf("%d",&n)!=EOF){
		
		for(i=0;i<2010;i++)
			a[i]=i;
			
		for(i=0;i<n;i++){
			scanf("%d %d",&u,&v);
			join(u,v);
		}
		
		countt1=0;
		queue<int> q; 
		q.push(1);
		
		while(1){
			node=q.front();
			q.pop();
			if(node==a[node])
				break;
			q.push(a[node]);
			countt1++;
		}
		
		
		countt2=0;
		queue<int> qq; 
		qq.push(2);
		while(1){
			node=qq.front();
			qq.pop();
			if(node==a[node])
				break;
			qq.push(a[node]);
			countt2++;
		}
		
		if(countt1>countt2)
			printf("You are my elder\n");
		else if(countt1<countt2)
			printf("You are my younger\n");
		else
			printf("You are my brother\n");
	} 
	
	
	return 0;
}

 

3.Friends number

题目地址http://192.168.49.228/problem.php?cid=1018&pid=6

题目大意:有x,y 两个数,x的全部因子的和是y,y的全部因子的和是x,这样的x,y称为一对friend number,

给定任意区间x--y,问在x到y之间存在几对friend number;

由于数的范围太大,如果每次都对区间进行查询,会超时,所以事先打表。

下面是打表代码:

#include<stdio.h>
#include<string.h>
int a[5000005],vis[5000005];
 
int main()
{
	int i,j,k;
	
	memset(a,0,sizeof(a));
	memset(vis,0,sizeof(vis));
	
	a[0]=0;a[1]=1;
	for(i=2;i<=5000000;i++){
		a[i]+=1;
		for(j=i+i;j<=5000000;j+=i)
			a[j]+=i;
	}
	
	int countt=0;
	for(i=2;i<=5000000;i++){
		
		if(a[i]<=5000000&&i!=a[i]&&i==a[a[i]]&&vis[i]==0){

			printf("%d , %d ,\n",i,a[i]);
			vis[i]=1;
			vis[a[i]]=1;
			countt++;
		}
	}
	
	printf("%d***\n",countt);
}

通过打表发现,在5000000内共71对friend number,所以直接打表得到结果

#include<stdio.h>
#include<string.h>
int a[100][2]={220 , 284 ,1184 , 1210 ,2620 , 2924 ,5020 , 5564 ,6232 , 6368 ,
10744 , 10856 ,12285 , 14595 ,17296 , 18416 ,63020 , 76084 ,66928 , 66992 ,
67095 , 71145 ,69615 , 87633 ,79750 , 88730 ,100485 , 124155 ,122265 , 139815 ,
122368 , 123152 ,141664 , 153176 ,142310 , 168730 ,171856 , 176336 ,176272 , 180848 ,
185368 , 203432 ,196724 , 202444 ,280540 , 365084 ,308620 , 389924 ,319550 , 430402 ,
356408 , 399592 ,437456 , 455344 ,469028 , 486178 ,503056 , 514736 ,522405 , 525915 ,
600392 , 669688 ,609928 , 686072 ,624184 , 691256 ,635624 , 712216 ,643336 , 652664 ,
667964 , 783556 ,726104 , 796696 ,802725 , 863835 ,879712 , 901424 ,898216 , 980984 ,
947835 , 1125765 ,998104 , 1043096 ,1077890 , 1099390 ,1154450 , 1189150 ,1156870 , 1292570 ,
1175265 , 1438983 ,1185376 , 1286744 ,1280565 , 1340235 ,1328470 , 1483850 ,1358595 , 1486845 ,
1392368 , 1464592 ,1466150 , 1747930 ,1468324 , 1749212 ,1511930 , 1598470 ,1669910 , 2062570 ,
1798875 , 1870245 ,2082464 , 2090656 ,2236570 , 2429030 ,2652728 , 2941672 ,2723792 , 2874064 ,
2728726 , 3077354 ,2739704 , 2928136 ,2802416 , 2947216 ,2803580 , 3716164 ,3276856 , 3721544 ,
3606850 , 3892670 ,3786904 , 4300136 ,3805264 , 4006736 ,4238984 , 4314616 ,4246130 , 4488910 ,
4259750 , 4445050 };
int main()
{		
	int x,y;
	while(scanf("%d %d",&x,&y)!=EOF){
		
		int countt=0;
		
		for(int i=0;i<71;i++){
			if(a[i][0]>=x&&a[i][0]<=y&&a[i][1]>=x&&a[i][1]<=y)
				countt++;
		}
		
		printf("%d\n",countt);
	}
	
	return 0;
}

 

 

4.NEW RDSP MODE I

题目地址http://192.168.49.228/problem.php?cid=1018&pid=8

题目大意:给n,m,x,代表有n个编号为1--n的整数,有操作:将奇数位的数字拿出来放在按顺序排好的偶数位

序列的后面,经过m次这样的操作得到的序列的前x个数字是什么。

如果只观察一个位置的变化,就可以看出数列变化的规律:

    如果该位上的数字是x,有 :  1.如果 x<=n/2; 下一次变化x=x*2;

                                                    2.如果x>n/2,   下一次变化x=(x-n/2)*2-1;

由于m过大,可以找到数列变化的周期t,然后由 m=m%t, 即可以缩小操作次数。

同时因为只求的前x个数字,只看前x个数字的变化即可。

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n,m,x,i,u,v;
	while(cin >> n >> m >> x){
	
		int t=0;
		int k=1;
		
		while(1){
			if(k<=n/2)
				k=k*2;
			else
				k=(k-n/2)*2-1;
			t++;	
			if(k==1)
				break;
		} 
		
		m=m%t;
		for(i=1;i<=x;i++){
			u=i;
			v=m;
			while(v--){
				if(u<=n/2)
					u=u*2;
				else
					u=(u-n/2)*2-1;
			}
			
			if(i==1)
				printf("%d",u);
			else
				printf(" %d",u);
		}
		printf("\n");
	}
	
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值