穩贏(2017年真題)
大家應該都會玩“錘子剪刀布”的游戲:兩人同時給出手勢,勝負規則如圖所示:
現要求你編寫一個穩贏不輸的程序,根據對方的出招,給出對應的贏招。但是!為了不讓對方輸得太慘,你需要每隔K次就讓一個平局。
輸入格式:
輸入首先在第一行給出正整數K(<=10),即平局間隔的次數。隨后每行給出對方的一次出招:“ChuiZi”代表“錘子”、“JianDao”代表“剪刀”、“Bu”代表“布”。“End”代表輸入結束,這一行不要作為出招處理。
輸出格式:
對每一個輸入的出招,按要求輸出穩贏或平局的招式。每招占一行。
輸入樣例:
2 ChuiZi JianDao Bu JianDao Bu ChuiZi ChuiZi End
輸出樣例:
Bu ChuiZi Bu ChuiZi JianDao ChuiZi Bu
代碼如下:
#include<stdio.h>
#include <string.h>
int main()
{
int Search;
scanf("%d",&Search);
char ch[15];
int ti = 1;
while(scanf("%s",&ch),strcmp(ch,"End")!=0)
{
if(ti%(Search+1) == 0) printf("%s\n",ch);
else if(strcmp(ch,"Bu")==0)printf("JianDao\n");
else if(strcmp(ch,"ChuiZi")==0)printf("Bu\n");
else printf("ChuiZi\n");
ti++;
}
return 0;
}
輸出GPLT
給定一個長度不超過10000的、僅由英文字母構成的字符串。請將字符重新調整順序,按“GPLTGPLT....”這樣的順序輸出,並忽略其它字符。當然,四種字符(不區分大小寫)的個數不一定是一樣多的,若某種字符已經輸出完,則余下的字符仍按GPLT的順序打印,直到所有字符都被輸出。
輸入格式:
輸入在一行中給出一個長度不超過10000的、僅由英文字母構成的非空字符串。
輸出格式:
在一行中按題目要求輸出排序后的字符串。題目保證輸出非空。
輸入樣例:
pcTclnGloRgLrtLhgljkLhGFauPewSKgt
輸出樣例:
GPLTGPLTGLTGLGLL
代碼如下:
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
char a[10000],c[4]={'G','P','L','T'};
int i,len,q,w,e,r,b[4];
gets(a);
len=strlen(a);
q=w=e=r=0;
for(i=0;i<len;i++)
{
if(a[i]>='a' && a[i]<='z')
a[i]=a[i]-32;
if(a[i]=='G')
q++;
else
if(a[i]=='P')
w++;
else
if(a[i]=='L')
e++;
else
if(a[i]=='T')
r++;
}
b[0]=q;b[1]=w;b[2]=e;b[3]=r;
while(b[0]!=0 || b[1]!=0 || b[2]!=0 || b[3]!=0)
{
for(i=0;i<4;i++)
{
if(b[i]!=0)
{
printf("%c",c[i]);
b[i]--;
}
}
}
return 0;
}
情人節(2017年真題)
以上是朋友圈中一奇葩貼:“2月14情人節了,我決定造福大家。第2個贊和第14個贊的,我介紹你倆認識…………咱三吃飯…你倆請…”。現給出此貼下點贊的朋友名單,請你找出那兩位要請客的倒霉蛋。
輸入格式:
輸入按照點贊的先后順序給出不知道多少個點贊的人名,每個人名占一行,為不超過10個英文字母的非空單詞,以回車結束。一個英文句點“.”標志輸入的結束,這個符號不算在點贊名單里。
輸出格式:
根據點贊情況在一行中輸出結論:若存在第2個人A和第14個人B,則輸出“A and B are inviting you to dinner...”;若只有A沒有B,則輸出“A is the only one for you...”;若連A都沒有,則輸出“Momo... No one is for you ...”。
輸入樣例1:GaoXZh Magi Einst Quark LaoLao FatMouse ZhaShen fantacy latesum SenSen QuanQuan whatever whenever Potaty hahaha .輸出樣例1:
Magi and Potaty are inviting you to dinner...輸入樣例2:
LaoLao FatMouse whoever .輸出樣例2:
FatMouse is the only one for you...輸入樣例3:
LaoLao .輸出樣例3:
Momo... No one is for you ...
代碼如下:
#include<stdio.h>
#include <string.h>
int main()
{
char name[20];
int flag2=0,flag14=0;
int time = 1;
char name2[20],name14[20];
while(scanf("%s",&name),strcmp(name,".")!=0)
{
if(time == 2) {strcpy(name2,name);flag2=1;}
if(time == 14) {strcpy(name14,name);flag14=1;}
time = time+1;
}
if(!flag2 && !flag14) printf("Momo... No one is for you ...\n");
else if(!flag14) printf("%s is the only one for you...\n",name2);
else printf("%s and %s are inviting you to dinner...\n",name2,name14);
return 0;
}
點贊
微博上有個“點贊”功能,你可以為你喜歡的博文點個贊表示支持。每篇博文都有一些刻畫其特性的標簽,而你點贊的博文的類型,也間接刻畫了你的特性。本題就要求你寫個程序,通過統計一個人點贊的紀錄,分析這個人的特性。
輸入格式:
輸入在第一行給出一個正整數N(<=1000),是該用戶點贊的博文數量。隨后N行,每行給出一篇被其點贊的博文的特性描述,格式為“K F1... FK”,其中 1<=K<=10,Fi(i=1, ..., K)是特性標簽的編號,我們將所有特性標簽從1到1000編號。數字間以空格分隔。
輸出格式:
統計所有被點贊的博文中最常出現的那個特性標簽,在一行中輸出它的編號和出現次數,數字間隔1個空格。如果有並列,則輸出編號最大的那個。
輸入樣例:4 3 889 233 2 5 100 3 233 2 73 4 3 73 889 2 2 233 123輸出樣例:
233 3
代碼如下:
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
int f[1005];
int main()
{
int ch;
scanf("%d",&ch);
memset(f,0,sizeof(f));
int k,n,Max,Max_value = -1;
for(int i=1; i<=ch; i++)
{
scanf("%d",&n);
for(int j=1; j<=n; j++)
{
scanf("%d",&k);
f[k]++;
if(Max == f[k])
Max_value = max(Max_value,k);
if(Max < f[k])
{
Max_value = k;
Max = f[k];
}
}
}
printf("%d %d\n",Max_value,Max);
return 0;
}
古風排版(2017年真題)
中國的古人寫文字,是從右向左豎向排版的。本題就請你編寫程序,把一段文字按古風排版。
輸入格式:
輸入在第一行給出一個正整數N(<100),是每一列的字符數。第二行給出一個長度不超過1000的非空字符串,以回車結束。
輸出格式:
按古風格式排版給定的字符串,每列N個字符(除了最后一列可能不足N個)
輸入樣例:4 This is a test case輸出樣例:
asa T st ih e tsi ce s
代碼如下:
#include <stdio.h>
#include <string.h>
char a[105][105];
int main()
{
int n;
scanf("%d",&n);
char ch[1005];
getchar();
gets(ch);
int x = 1,y=1;
for(int i=0;i<strlen(ch);i++)
{
a[x++][y] = ch[i];
if(x == n+1)
{
y++;
x = 1;
}
}
if(x!=1){
while(x<=n)
{
a[x][y] = ' ';
x++;
}
y++;
}
for(int i=1;i<=n;i++)
{
for(int j=y-1;j>=1;j--)
{
printf("%c",a[i][j]);
}
printf("\n");
}
return 0;
}
閱覽室
天梯圖書閱覽室請你編寫一個簡單的圖書借閱統計程序。當讀者借書時,管理員輸入書號並按下S鍵,程序開始計時;當讀者還書時,管理員輸入書號並按下E鍵,程序結束計時。書號為不超過1000的正整數。當管理員將0作為書號輸入時,表示一天工作結束,你的程序應輸出當天的讀者借書次數和平均閱讀時間。
注意:由於線路偶爾會有故障,可能出現不完整的紀錄,即只有S沒有E,或者只有E沒有S的紀錄,系統應能自動忽略這種無效紀錄。另外,題目保證書號是書的唯一標識,同一本書在任何時間區間內只可能被一位讀者借閱。
輸入格式:
輸入在第一行給出一個正整數N(<= 10),隨后給出N天的紀錄。每天的紀錄由若干次借閱操作組成,每次操作占一行,格式為:
書號([1, 1000]內的整數) 鍵值(“S”或“E”) 發生時間(hh:mm,其中hh是[0,23]內的整數,mm是[0, 59]內整數)
每一天的紀錄保證按時間遞增的順序給出。
輸出格式:
對每天的紀錄,在一行中輸出當天的讀者借書次數和平均閱讀時間(以分鍾為單位的精確到個位的整數時間)。
輸入樣例:3 1 S 08:10 2 S 08:35 1 E 10:00 2 E 13:16 0 S 17:00 0 S 17:00 3 E 08:10 1 S 08:20 2 S 09:00 1 E 09:20 0 E 17:00
輸出樣例:
2 196 0 0 1 60
代碼如下:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int main()
{
int number;
scanf("%d",&number);
while(number--)
{
char ch;
int h,s,x;
int f[1005],x1[1005];
memset(f,-1,sizeof(f));
memset(x1,0,sizeof(x1));
double time=0,sum=0;
while(scanf("%d %c %d:%d",&h,&ch,&s,&x)!=EOF)
{
if(h == 0){
if(sum == 0)
printf("0 0\n");
else
printf("%.0lf %.0lf\n",sum,(time/sum));
break;
}else{
if(ch == 'S'){
f[h] = s*60+x;
}else{
if(f[h] == -1)
continue;
time = time + s*60+x - f[h];
f[h] = -1;
sum++;
}
}
}
}
return 0;
}
排座位
布置宴席最微妙的事情,就是給前來參宴的各位賓客安排座位。無論如何,總不能把兩個死對頭排到同一張宴會桌旁!這個艱巨任務現在就交給你,對任何一對客人,請編寫程序告訴主人他們是否能被安排同席。
輸入格式:
輸入第一行給出3個正整數:N(<= 100),即前來參宴的賓客總人數,則這些人從1到N編號;M為已知兩兩賓客之間的關系數;K為查詢的條數。隨后M行,每行給出一對賓客之間的關系,格式為:“賓客1 賓客2 關系”,其中“關系”為1表示是朋友,-1表示是死對頭。注意兩個人不可能既是朋友又是敵人。最后K行,每行給出一對需要查詢的賓客編號。
這里假設朋友的朋友也是朋友。但敵人的敵人並不一定就是朋友,朋友的敵人也不一定是敵人。只有單純直接的敵對關系才是絕對不能同席的。
輸出格式:
對每個查詢輸出一行結果:如果兩位賓客之間是朋友,且沒有敵對關系,則輸出“No problem”;如果他們之間並不是朋友,但也不敵對,則輸出“OK”;如果他們之間有敵對,然而也有共同的朋友,則輸出“OK but...”;如果他們之間只有敵對關系,則輸出“No way”。
輸入樣例:7 8 4 5 6 1 2 7 -1 1 3 1 3 4 1 6 7 -1 1 2 1 1 4 1 2 3 -1 3 4 5 7 2 3 7 2
輸出樣例:
No problem OK OK but... No way
代碼如下:
#include<iostream>
#include<cstdio>
using namespace std;
int fa[105];
int dd[105][105];
int find(int x)
{
return fa[x]==x?x:fa[x]=find(fa[x]);
}
void Merge(int x,int y)
{
int dx,dy;
dx=find(x);
dy=find(y);
if(dx!=dy)
{
fa[dy]=x;
}
}
int main()
{
int n,m,k;
for(int i=0;i<105;i++)
fa[i]=i;
cin>>n>>m>>k;
for(int i=0;i<m;i++)
{
int a,b,r;
cin>>a>>b>>r;
if(r==-1)
dd[a][b]=dd[b][a]=-1;
if(r==1)
Merge(a,b);
}
for(int i=0;i<k;i++)
{
int x,y;
cin>>x>>y;
if(find(x)==find(y)&&dd[x][y]!=-1)
cout<<"No problem"<<endl;
if(find(x)!=find(y)&&dd[x][y]!=-1)
cout<<"OK"<<endl;
if(find(x)==find(y)&&dd[x][y]==-1)
cout<<"OK but..."<<endl;
if(find(x)!=find(y)&&dd[x][y]==-1)
cout<<"No way"<<endl;
}
return 0;
}
鏈表去重
給定一個帶整數鍵值的單鏈表L,本題要求你編寫程序,刪除那些鍵值的絕對值有重復的結點。即對任意鍵值K,只有鍵值或其絕對值等於K的第一個結點可以被保留。同時,所有被刪除的結點必須被保存在另外一個鏈表中。例如:另L為21→-15→-15→-7→15,則你必須輸出去重后的鏈表21→-15→-7、以及被刪除的鏈表-15→15。
輸入格式:
輸入第一行包含鏈表第一個結點的地址、以及結點個數N(<= 105 的正整數)。結點地址是一個非負的5位整數,NULL指針用-1表示。
隨后N行,每行按下列格式給出一個結點的信息:
Address Key Next
其中Address是結點的地址,Key是絕對值不超過104的整數,Next是下一個結點的地址。
輸出格式:
首先輸出去重后的鏈表,然后輸出被刪除結點組成的鏈表。每個結點占一行,按輸入的格式輸出。
輸入樣例:00100 5 99999 -7 87654 23854 -15 00000 87654 15 -1 00000 -15 99999 00100 21 23854輸出樣例:
00100 21 23854 23854 -15 99999 99999 -7 -1 00000 -15 87654 87654 15 -1
代碼如下:
#include <stdio.h>
#include <string.h>
///標記。s輸出
int data[100000],next[100000],flag[100000],flag2[100000];
int abs(int n)
{
return n<0?-n:n;
}
int main()
{
int start,n,x,y,z;
scanf("%d%d",&start,&n);
///初始化
memset(data,-1,sizeof(data));
memset(next,-1,sizeof(next));
memset(flag,-1,sizeof(flag));
memset(flag2,-1,sizeof(flag2));
///開始存入。節點信息查詢結構為data[x] = key,next[x] = next;
for(int i=0; i<n; i++)
{
scanf("%d %d %d",&x,&y,&z);
data[x] = y;
next[x] = z;
}
y = start;
printf("%05d %d ",start,data[start]);
flag[abs(data[start])]=1;
flag2[start] = 1;
start = next[start];
while(true)
{
while(flag[abs(data[start])]==1 && start!=-1)
start = next[start];
if(start == -1)
{
printf("%d\n",-1);
break;
}
else
printf("%05d\n%05d %d ",start,start,data[start]);
flag2[start]=1;
flag[abs(data[start])]=1;
}
start = y;
while(flag2[start]==1 && start!=-1)
start = next[start];
flag2[start]=1;
///如果沒有重復的元素刪除,就直接返回0,結束
if(start == -1) return 0;
while(true)
{
printf("%05d %d ",start,data[start]);
while(flag2[start]==1 && start!=-1)
start = next[start];
if(start == -1)
{
printf("-1\n");
break;
}
else
printf("%05d\n",start);
flag2[start] = 1;
}
return 0;
}
