苦中作乐 ---竞赛刷题51-70(15-20)

(一)目录

L1-054 福到了

L1-056 猜数字

L1-058 6翻了

L1-059 敲笨钟

L1-062 幸运彩票

L1-064 估值一亿的AI核心代码

L1-069 胎压监测

L1-070 吃火锅

(二)题目 

L1-054 福到了

       “福”字倒着贴,寓意“福到”。不论到底算不算民俗,本题且请你编写程序,把各种汉字倒过来输出。这里要处理的每个汉字是由一个 N × N 的网格组成的,网格中的元素或者为字符 @ 或者为空格。而倒过来的汉字所用的字符由裁判指定。

输入格式:

输入在第一行中给出倒过来的汉字所用的字符、以及网格的规模 N (不超过100的正整数),其间以 1 个空格分隔;随后 N 行,每行给出 N 个字符,或者为 @ 或者为空格。

输出格式:

输出倒置的网格,如样例所示。但是,如果这个字正过来倒过去是一样的,就先输出bu yong dao le,然后再用输入指定的字符将其输出。

输入样例 1:

$ 9
 @  @@@@@
@@@  @@@ 
 @   @ @ 
@@@  @@@ 
@@@ @@@@@
@@@ @ @ @
@@@ @@@@@
 @  @ @ @
 @  @@@@@

输出样例 1:

$$$$$  $ 
$ $ $  $ 
$$$$$ $$$
$ $ $ $$$
$$$$$ $$$
 $$$  $$$
 $ $   $ 
 $$$  $$$
$$$$$  $ 

输入样例 2:

& 3
@@@
 @ 
@@@

输出样例 2:

bu yong dao le
&&&
 & 
&&&

分析:本题难点在于怎么分析它是对称的?其实也没有多难,就是第一行和最后一行比较,然后第一行换成第二行,最后一行变成倒数第二行进行比较,以此类推,当有不对称时直接返回,改变标志。

代码:

#include<iostream>
#include<string>
using namespace std;
int main() {
	char s ;cin>>s;
	int n;cin>>n;
	char cc[101][101]; 
	getchar();//把回车吃掉
   for(int i=0;i<n;i++){
   	for(int jj=0;jj<n;jj++){
	   scanf("%c",&cc[i][jj]);	 
	   } getchar(); //把回车吃掉,字符串输入,请你要把回车吃掉哦
  	
   }

   //判断是否是对称
       int flag=true;      
       for(int i=0;i<n;i++){
        	for(int jj=0;jj<n;jj++){
        		if(cc[ i ][ jj]!=cc[n-i-1][n-1-jj])
        		{
					  flag=false;
					  break;
				}
    		 		  
    			   }
    			
				   if(!flag)
    			   {
    			    
				   	break;
				   }
    		  
    		   }
      if(flag) cout<<"bu yong dao le\n";
    			   
    for(int i=0;i<n;i++){
     	for(int jj=0;jj<n;jj++){
     		if(cc[n-i-1][n-1-jj]!=' ') cout<<s;
     		else{
			 		   cout<<cc[n-i-1][n-1-jj];		
			 }
 		  
 			   }
 		  putchar('\n');
 		   }
 		 

	return 0;
}



L1-056 猜数字

一群人坐在一起,每人猜一个 100 以内的数,谁的数字最接近大家平均数的一半就赢。本题就要求你找出其中的赢家。

输入格式:

输入在第一行给出一个正整数N(≤104)。随后 N 行,每行给出一个玩家的名字(由不超过8个英文字母组成的字符串)和其猜的正整数(≤ 100)。

输出格式:

在一行中顺序输出:大家平均数的一半(只输出整数部分)、赢家的名字,其间以空格分隔。题目保证赢家是唯一的。

输入样例:

7
Bob 35
Amy 28
James 98
Alice 11
Jack 45
Smith 33
Chris 62

输出样例:

22 Amy

思路:先遍历求得 大家平均数,然后再求得平均数的一半,再把它遍历一遍,找定义一个差值最小,把(abs(每个人猜的数-平均数))与之比较,小就换。

代码:

#include<stdio.h>
int main(){
	int sum=0,i,j,n,cnt[10001];//cnt用于记录数字 
	char ch[10001][9];//ch用于记录名字 
	scanf("%d",&n);
	getchar();
	for(i=0;i<n;i++){
		scanf("%s %d",&ch[i],&cnt[i]);
		sum+=cnt[i];
	}
	sum=sum/n/2;//求出平均数的一半 
	printf("%d ",sum);//先输出sum 
	int min,flag=0;//min记录最小差值,falg记录名字的下标 
	min=cnt[0]-sum;
	if(min<0){
		min*=-1;//取绝对值 
	}
	for(i=0;i<n;i++){
		j=cnt[i]-sum;
		if(j<0){
			j*=-1;//取绝对值 
		}
		if(j<min){
			flag=i;
			min=j;
		}
	}
	printf("%s",ch[flag]);
}

L1-058 6翻了

       “666”是一种网络用语,大概是表示某人很厉害、我们很佩服的意思。最近又衍生出另一个数字“9”,意思是“6翻了”,实在太厉害的意思。如果你以为这就是厉害的最高境界,那就错啦 —— 目前的最高境界是数字“27”,因为这是 3 个 “9”!

本题就请你编写程序,将那些过时的、只会用一连串“6666……6”表达仰慕的句子,翻译成最新的高级表达。

输入格式:

输入在一行中给出一句话,即一个非空字符串,由不超过 1000 个英文字母、数字和空格组成,以回车结束。

输出格式:

从左到右扫描输入的句子:如果句子中有超过 3 个连续的 6,则将这串连续的 6 替换成 9;但如果有超过 9 个连续的 6,则将这串连续的 6 替换成 27。其他内容不受影响,原样输出。

输入样例:

it is so 666 really 6666 what else can I say 6666666666

输出样例:

it is so 666 really 9 what else can I say 27

思路:getline,

代码:

#include<iostream>
#include<string>
using namespace std;
int main() {
	string str;
	int s, count = 0;
	getline(cin, str);
	for (int i = 0; i < str.size(); i++) {
		count = 0;
		while (str[i] == '6'&&++i&&++count);
		cout << (count > 9 ? "27" : (count > 3 ? "9" : string(count, '6')));
		cout << str[i];
	}
	return 0;
}

L1-059 敲笨钟

微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。为了增加敲钟的趣味性,还会糟改几句古诗词。其糟改的方法为:去网上搜寻压“ong”韵的古诗词,把句尾的三个字换成“敲笨钟”。例如唐代诗人李贺有名句曰:“寻章摘句老雕虫,晓月当帘挂玉弓”,其中“虫”(chong)和“弓”(gong)都压了“ong”韵。于是这句诗就被糟改为“寻章摘句老雕虫,晓月当帘敲笨钟”。

现在给你一大堆古诗词句,要求你写个程序自动将压“ong”韵的句子糟改成“敲笨钟”。

输入格式:

输入首先在第一行给出一个不超过 20 的正整数 N。随后 N 行,每行用汉语拼音给出一句古诗词,分上下两半句,用逗号 , 分隔,句号 . 结尾。相邻两字的拼音之间用一个空格分隔。题目保证每个字的拼音不超过 6 个字符,每行字符的总长度不超过 100,并且下半句诗至少有 3 个字。

输出格式:

对每一行诗句,判断其是否压“ong”韵。即上下两句末尾的字都是“ong”结尾。如果是压此韵的,就按题面方法糟改之后输出,输出格式同输入;否则输出 Skipped,即跳过此句。

输入样例:

5
xun zhang zhai ju lao diao chong, xiao yue dang lian gua yu gong.
tian sheng wo cai bi you yong, qian jin san jin huan fu lai.
xue zhui rou zhi leng wei rong, an xiao chen jing shu wei long.
zuo ye xing chen zuo ye feng, hua lou xi pan gui tang dong.
ren xian gui hua luo, ye jing chun shan kong.

输出样例:

xun zhang zhai ju lao diao chong, xiao yue dang lian qiao ben zhong.
Skipped
xue zhui rou zhi leng wei rong, an xiao chen jing qiao ben zhong.
Skipped
Skipped

分析:能实现字符串的空格输入,只有两种办法:getline,gets;这道题主要是遍历找东西,一找','(判断是不是押韵),二找最后面的三个空格(方便输出)。 

代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;
	getchar();
	while(n--){
		string str;
		getline(cin,str);
		int len=str.size(),a,b,c,sum=0;
		for(int i=0;i<len;i++){
			if(str[i]==',')
				a=i;
			if(str[i]=='.')
				b=i;
		}
		for(int i=len-1;i>=0;i--){
			if(str[i]==' ')
				sum++;
			if(sum==3){
				c=i;
				break;
			}
		}
		int flag1=0,flag2=0;
		if(str[a-1]=='g'&&str[a-2]=='n'&&str[a-3]=='o')
			flag1=1;
		if(str[b-1]=='g'&&str[b-2]=='n'&&str[b-3]=='o')
			flag2=1;
		if(flag1&&flag2){
			for(int i=0;i<=c;i++){
				cout<<str[i];
			}
			cout<<"qiao ben zhong."<<endl;
		}
		else
			cout<<"Skipped"<<endl;
	}
}

L1-062 幸运彩票

彩票的号码有 6 位数字,若一张彩票的前 3 位上的数之和等于后 3 位上的数之和,则称这张彩票是幸运的。本题就请你判断给定的彩票是不是幸运的。

输入格式:

输入在第一行中给出一个正整数 N(≤ 100)。随后 N 行,每行给出一张彩票的 6 位数字。

输出格式:

对每张彩票,如果它是幸运的,就在一行中输出 You are lucky!;否则输出 Wish you good luck.

输入样例:

2
233008
123456

输出样例:

You are lucky!
Wish you good luck.

分析怎么样输入,用什么数据类型装数据,int 数组,char 数组(字符串),如果是字符串就要考虑‘0’-0=48。(貌似都不需要考虑)其余部分一样的。

代码: 

#include<iostream>
#include<string>
using namespace std;
int main() {
	int n;cin>>n;
	char s [9];
 for(int i=0;i<n;i++){
   scanf("%s",s);int snum=s[0]+s[1]+s[2];int snum1=s[3]+s[4]+s[5];
   if(snum==snum1) printf("You are lucky!\n");
   else printf("Wish you good luck.\n");
 }
 

	return 0;
}



L1-064 估值一亿的AI核心代码

本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:

  • 无论用户说什么,首先把对方说的话在一行中原样打印出来;
  • 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;   ->跟6翻了那道题,思路类似
  • 把原文中所有大写英文字母变成小写,除了 I
  • 把原文中所有独立的 can youcould you 对应地换成 I canI could—— 这里“独立”是指被空格或标点符号分隔开的单词;
  • 把原文中所有独立的 I 和 me 换成 you
  • 把原文中所有的问号 ? 换成惊叹号 !
  • 在一行中输出替换后的句子作为 AI 的回答。

输入格式:

输入首先在第一行给出不超过 10 的正整数 N,随后 N 行,每行给出一句不超过 1000 个字符的、以回车结尾的用户的对话,对话为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。

输出格式:

按题面要求输出,每个 AI 的回答前要加上 AI: 和一个空格。

输入样例:

6
Hello ?
 Good to chat   with you
can   you speak Chinese?
Really?
Could you show me 5
What Is this prime? I,don 't know

输出样例:

Hello ?
AI: hello!
 Good to chat   with you
AI: good to chat with you
can   you speak Chinese?
AI: I can speak chinese!
Really?
AI: really!
Could you show me 5
AI: I could show you 5
What Is this prime? I,don 't know
AI: what Is this prime! you,don't know

思路:

代码:

#include<iostream>
#include<cstring>
using namespace std;
#define Change_I s2[len2++]='y',s2[len2++]='o',s2[len2++]='u';continue;  // I 与 me 转换记入
#define Change_1 s2[len2++]='I',s2[len2++]=' ',s2[len2++]='c',s2[len2++]='a',s2[len2++]='n'; // can you 转换记入
#define Change_2 s2[len2++]='I',s2[len2++]=' ',s2[len2++]='c',s2[len2++]='o',s2[len2++]='u',s2[len2++]='l',s2[len2++]='d'; // could you 转换记入操作
bool Flag_I(char s1[10001], int z);
bool Flag_M(char s[10001], int z);
int main()
{
    char s1[10001],s2[10001]; // 注意字符串要够大,不然会有测试点过不了
    int num,flag;
    cin >> num;
    getchar();
    //  开始数据读入 num 次
    while (num--)
    {
        int len1,len2=0;
        cin.getline(s1,1001);
        cout << s1 << endl;
 
        /*  去掉头尾空格  */
        for(flag=0 ; flag<strlen(s1) ; flag++) if(s1[flag]!=' ') break;
        strcpy(s1,s1+flag);
        for(flag=strlen(s1)-1 ; flag>=0; flag--) if(s1[flag]!=' ') break;
        s1[flag+1] = '\0';
 
        //  初步处理: 去掉多余空格 ,大小转小写 , ? -> !
        len1 = strlen(s1);
        for(int z=0;z<len1;z++)
        {
            if(s1[z]>='A' && s1[z]<='Z' && s1[z]!='I') s1[z] += 32;
            if(s1[z]=='?') s1[z] = '!';
            if(s1[z]==' ' && isalnum(s1[z+1])==0) continue;
            s2[len2++] = s1[z];
        }
        s2[len2]= '\0';
        strcpy(s1,s2);
        len1 = len2; len2 = 0;
 
        //  开始核心判断
        for(int z=0;z<len1;z++)
        {
            if(s1[z]=='I') if(Flag_I(s1,z)) {Change_I}
            if(s1[z]=='m') if(Flag_M(s1,z)) {z++;Change_I}
 
            if(strstr(s1+z,"can you")==s1+z){
                 if(len1==7)                                           {Change_1;z+=6;continue;}
                 if(z==0 && isalnum(s1[z+7])==0)                    {Change_1;z+=6;continue;}
                 if(z==len1-7 && isalnum(s1[z+7])==0)               {Change_1;z+=6;continue;}
                if(isalnum(s1[z-1])==0 && isalnum(s1[z+7])==0)  {Change_1;z+=6;continue;}
            }
 
            if(strstr(s1+z,"could you")==s1+z){
                 if(len1==9)                                            {Change_2;z+=8;continue;}
                 if(z==0 && isalnum(s1[z+9])==0)                     {Change_2;z+=8;continue;}
                 if(z==len1-9 && isalnum(s1[z+9])==0)                {Change_2;z+=8;continue;}
                if(isalnum(s1[z-1])==0 && isalnum(s1[z+9])==0)   {Change_2;z+=8;continue;}
            }
            s2[len2++] = s1[z];
        }
        //  AI : 回答输出
        s2[len2] = '\0';
        cout << "AI: " << s2 << endl;
    }
    return 0;
}
bool Flag_M(char s[10001], int z) {
    int len = strlen(s);
    if(len<2 || z==len || s[z+1]!= 'e') return false;
     if(len==2) return true;
     if(z==0 && isalnum(s[z+2])==0) return true;
     else if(z==len-2 && isalnum(s[z-1])==0) return true;
     else
    if(isalnum(s[z-1])==0 && isalnum(s[z+2])==0 ) return true;
    return false;
}
bool Flag_I(char s[10000], int z) {
    int len = strlen(s);
//    if(len==1) return true; // 答案没有考虑一句只有一个 I 的情况,所有这句没写也是对的
//     else 
if(z==0 && isalnum(s[z+1])==0) return true;
     else if(z==len-1 && isalnum(s[z-1])==0) return true;
     else if(len>2 && isalnum(s[z-1])==0 && isalnum(s[z+1])==0) return true;
    return false;
}

L1-069 胎压监测

小轿车中有一个系统随时监测四个车轮的胎压,如果四轮胎压不是很平衡,则可能对行车造成严重的影响。让我们把四个车轮 —— 左前轮、右前轮、右后轮、左后轮 —— 顺次编号为 1、2、3、4。本题就请你编写一个监测程序,随时监测四轮的胎压,并给出正确的报警信息。报警规则如下:

  • 如果所有轮胎的压力值与它们中的最大值误差在一个给定阈值内,并且都不低于系统设定的最低报警胎压,则说明情况正常,不报警;
  • 如果存在一个轮胎的压力值与它们中的最大值误差超过了阈值,或者低于系统设定的最低报警胎压,则不仅要报警,而且要给出可能漏气的轮胎的准确位置;
  • 如果存在两个或两个以上轮胎的压力值与它们中的最大值误差超过了阈值,或者低于系统设定的最低报警胎压,则报警要求检查所有轮胎。

输入格式:

输入在一行中给出 6 个 [0, 400] 范围内的整数,依次为 1~4 号轮胎的胎压、最低报警胎压、以及胎压差的阈值。

输出格式:

根据输入的胎压值给出对应信息:

  • 如果不用报警,输出 Normal
  • 如果有一个轮胎需要报警,输出 Warning: please check #X!,其中 X 是出问题的轮胎的编号;
  • 如果需要检查所有轮胎,输出 Warning: please check all the tires!

输入样例 1:

242 251 231 248 230 20

输出样例 1:

Normal

输入样例 2:

242 251 232 248 230 10

输出样例 2:

Warning: please check #3!

输入样例 3:

240 251 232 248 240 10

输出样例 3:

Warning: please check all the tires!

分析:正常的数组遍历找东西 

代码:

 #include <stdio.h>
#include <stdlib.h>			//system头文件
#include <string.h>



int main()
{
    char a[10] = { 0 };
    int b[100] = { 0 }, max = -1, num = 0, point = 0;


    for (int i = 0; i < 6; i++) {
        scanf("%d", &b[i]);
        if (i == 0)    max = b[0];
        else if (b[i] > max) max = b[i];
    }
    //数据处理!
    for (int i = 0; i < 4; i++) {
        if ((max - b[i] > b[5]) || (b[i] < b[4]))
        {
            num++;
            point = i;
        }
    }

    if (num == 0)
    {
        printf("Normal");
    }
    else if (num >= 2) {
        printf("Warning: please check all the tires!");
    }
    else {
        printf("Warning: please check #%d!",  ++point);
    }


    return 0;
}

L1-070 吃火锅

以上图片来自微信朋友圈:这种天气你有什么破事打电话给我基本没用。但是如果你说“吃火锅”,那就厉害了,我们的故事就开始了。

本题要求你实现一个程序,自动检查你朋友给你发来的信息里有没有 chi1 huo3 guo1

输入格式:

输入每行给出一句不超过 80 个字符的、以回车结尾的朋友信息,信息为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。当读到某一行只有一个英文句点 . 时,输入结束,此行不算在朋友信息里。

输出格式:

首先在一行中输出朋友信息的总条数。然后对朋友的每一行信息,检查其中是否包含 chi1 huo3 guo1,并且统计这样厉害的信息有多少条。在第二行中首先输出第一次出现 chi1 huo3 guo1 的信息是第几条(从 1 开始计数),然后输出这类信息的总条数,其间以一个空格分隔。题目保证输出的所有数字不超过 100。

如果朋友从头到尾都没提 chi1 huo3 guo1 这个关键词,则在第二行输出一个表情 -_-#

输入样例 1:

Hello!
are you there?
wantta chi1 huo3 guo1?
that's so li hai le
our story begins from chi1 huo3 guo1 le
.

输出样例 1:

5
3 2

输入样例 2:

Hello!
are you there?
wantta qi huo3 guo1 chi1huo3guo1?
that's so li hai le
our story begins from ci1 huo4 guo2 le
.

输出样例 2:

5
-_-#

分析: 与上题类似,不过是复杂了一点。

代码:

#include<stdio.h>
#include<string.h>
int main()
{
   char target[15]="chi1 huo3 guo1";
   char s[100][80];
   int i,j;
   int num1=0,num2=0;//分别是总信息数和有火锅的信息数
   int first;
   
	for(i=0;i<=100;i++)
{
   	gets(s[i]);
   	if(s[i][0]=='.'&&strlen(s[i])==1)//有.且单独一排则退出
   	{
   		num1=i;//总信息数,注意.这行不算信息数
   		break;
	}
	if(strstr(s[i],target)!=NULL)
	{
		num2++;
		if(num2==1)
		{
			first=i+1;//首次出现的行数0
		}
	}
}
   	if(num2!=0)
   	{
   		printf("%d\n",num1);
   		printf("%d %d",first,num2);	
	}
	else
	{
        printf("%d\n",num1);
		printf("-_-#");
	}
	
	return 0;
   	
}
 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
7-8 敲笨钟 (15分) 微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。为了增加敲钟的趣味性,还会糟改几句古诗词。其糟改的方法为:去网上搜寻压“ong”韵的古诗词,把句尾的三个字换成“敲笨钟”。例如唐代诗人李贺有名句曰:“寻章摘句老雕虫,晓月当帘挂玉弓”,其“虫”(chong)和“弓”(gong)都压了“ong”韵。于是这句诗就被糟改为“寻章摘句老雕虫,晓月当帘敲笨钟”。 现在给你一大堆古诗词句,要求你写个程序自动将压“ong”韵的句子糟改成“敲笨钟”。 输入格式: 输入首先在第一行给出一个超过 20 的正整数 N。随后 N 行,每行用汉语拼音给出一句古诗词,分上下两半句,用逗号 , 分隔,句号 . 结尾。相邻两字的拼音之间用一个空格分隔。题目保证每个字的拼音不超过 6 个字符,每行字符的总长度不超过 100,并且下半句诗至少有 3 个字。 输出格式: 对每一行诗句,判断其是否压“ong”韵。即上下两句末尾的字都是“ong”结尾。如果是压此韵的,就按题面方法糟改之后输出,输出格式同输入;否则输出 Skipped,即跳过此句。 输入样例: 5 xun zhang zhai ju lao diao chong, xiao yue dang lian gua yu gong. tian sheng wo cai bi you yong, qian jin san jin huan fu lai. xue zhui rou zhi leng wei rong, an xiao chen jing shu wei long. zuo ye xing chen zuo ye feng, hua lou xi pan gui tang dong. ren xian gui hua luo, ye jing chun shan kong. 输出样例: xun zhang zhai ju lao diao chong, xiao yue dang lian qiao ben zhong. Skipped xue zhui rou zhi leng wei rong, an xiao chen jing qiao ben zhong. Skipped Skipped
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘 关

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值