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;
}