PTA L-1-30~L-1-56&&L-2-1~L-2-10

L1-030 一帮一 (15 分)
“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。

输入格式:
输入第一行给出正偶数N(≤50),即全班学生的人数。此后N行,按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串),其间以1个空格分隔。这里保证本班男女比例是1:1,并且没有并列名次。

输出格式:
每行输出一组两个学生的姓名,其间以1个空格分隔。名次高的学生在前,名次低的学生在后。小组的输出顺序按照前面学生的名次从高到低排列。

输入样例:
8
0 Amy
1 Tom
1 Bill
0 Cindy
0 Maya
1 John
1 Jack
0 Linda
输出样例:
Amy Jack
Tom Linda
Bill Maya
Cindy John

#include<bits/stdc++.h>
using namespace std;
struct node{
	int a;
	string name;
}a[100];
int main(){
	int n,i,j;
	cin>>n;
	for(i=0;i<n;i++){
		cin>>a[i].a>>a[i].name;
	}
	for(int i=0;i<n/2;i++){
		cout<<a[i].name<<" ";
		for(j=n-1;j>i;j--){
			if(a[j].a!=a[i].a&&a[j].a!=2){
				cout<<a[j].name;
				a[j].a=2;
				break;
			}
		}
		cout<<endl;
	}
	return 0;
}

L1-031 到底是不是太胖了 (10 分)
据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。真实体重与标准体重误差在10%以内都是完美身材(即 | 真实体重 − 标准体重 | < 标准体重×10%)。已知市斤是公斤的两倍。现给定一群人的身高和实际体重,请你告诉他们是否太胖或太瘦了。

输入格式:
输入第一行给出一个正整数N(≤ 20)。随后N行,每行给出两个整数,分别是一个人的身高H(120 < H < 200;单位:厘米)和真实体重W(50 < W ≤ 300;单位:市斤),其间以空格分隔。

输出格式:
为每个人输出一行结论:如果是完美身材,输出You are wan mei!;如果太胖了,输出You are tai pang le!;否则输出You are tai shou le!。

输入样例:
3
169 136
150 81
178 155
输出样例:
You are wan mei!
You are tai shou le!
You are tai pang le!

#include<bits/stdc++.h>
using namespace std;
struct node{
	double h;
	double w;
}a[30];
int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i].h>>a[i].w;
	}
	for(int i=0;i<n;i++){
		double m=(a[i].h-100)*0.9;
		if(abs(m-(a[i].w/2))<m*0.1){
			cout<<"You are wan mei!\n";
		} 
		else{
			if(m>(a[i].w/2)){
			cout<<"You are tai shou le!\n";}
			else{
			cout<<"You are tai pang le!\n";
			}		
		}
			
	}
	
	return 0;
}

L1-032 Left-pad (20 分)
根据新浪微博上的消息,有一位开发者不满NPM(Node Package Manager)的做法,收回了自己的开源代码,其中包括一个叫left-pad的模块,就是这个模块把javascript里面的React/Babel干瘫痪了。这是个什么样的模块?就是在字符串前填充一些东西到一定的长度。例如用去填充字符串GPLT,使之长度为10,调用left-pad的结果就应该是*****GPLT。Node社区曾经对left-pad紧急发布了一个替代,被严重吐槽。下面就请你来实现一下这个模块。

输入格式:
输入在第一行给出一个正整数N(≤10
​4
​​ )和一个字符,分别是填充结果字符串的长度和用于填充的字符,中间以1个空格分开。第二行给出原始的非空字符串,以回车结束。

输出格式:
在一行中输出结果字符串。

输入样例1:
15 _
I love GPLT
输出样例1:
____I love GPLT
输入样例2:
4 *
this is a sample for cut
输出样例2:
cut
这道题的输入注意
空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符,空白符可以是space,tab,newline等等,直到第一个非空白符出现为止。
cin遇到空格,回车,Tab作为分隔符,并且将输入的回车,空格,Tab清除缓存区
此题15 —之间有空格且下一排要输入回车
此题输入方法
方法一

int n;
	char a;
	cin>>n;
	scanf(" ");
	cin>>a;
	scanf("\n");
	string b;
	getline(cin,b);//用于有空格的字符串输入

方法二

int n;
	char a;
	char s[100];
	scanf("%d %c",n,a);
	getchar();
	gets(s);
	int lenth=strlen(s);//求s的长度 

方法三

int n;
	char a;
	cin>>n>>a;//其中可以不要scanf(" ");
	scanf("\n");
	string b;
	getline(cin,b);
	int lenth=b.length()

求字符串长度
int lenth=strlen(s);
int lenth=b.length()

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	char a;
	cin>>n;
	scanf(" ");
	cin>>a;
	scanf("\n");
	string b;
	getline(cin,b);
	if(n<b.length()){
		for(int i=b.length()-n;i<=b.length()-1;i++){
			cout<<b[i];
		}
	}else{
		int m=n-b.length();
		while(m--){
			cout<<a;
		}
		cout<<b;
	}
	return 0;
}

以上是新浪微博中一奇葩贴:“我出生于1988年,直到25岁才遇到4个数字都不相同的年份。”也就是说,直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求,自动填充“我出生于y年,直到x岁才遇到n个数字都不相同的年份”这句话。

输入格式:
输入在一行中给出出生年份y和目标年份中不同数字的个数n,其中y在[1, 3000]之间,n可以是2、或3、或4。注意不足4位的年份要在前面补零,例如公元1年被认为是0001年,有2个不同的数字0和1。

输出格式:
根据输入,输出x和能达到要求的年份。数字间以1个空格分隔,行首尾不得有多余空格。年份要按4位输出。注意:所谓“n个数字都不相同”是指不同的数字正好是n个。如“2013”被视为满足“4位数字都不同”的条件,但不被视为满足2位或3位数字不同的条件。

输入样例1:
1988 4
输出样例1:
25 2013
输入样例2:
1 2
输出样例2:
0 0001
0001的输入方式
printf("%d %04d",y-m,y); y不足四位的时候自动在前面加0

z为年份
1也可以直接这样
for(int i=0;i<4;i++){
			a[i]=z%10;
			z/=10;
		}
#include<bits/stdc++.h>
using namespace std;
int main(){
	int y,n;
	cin>>y>>n;
	int m=y;
	while(1){
		int t=y;
		int a[10]={0};
		for(int i=0;i<4;i++){
			a[t%10]=1;
			t/=10;
		}
		int same=0;
		for(int i=0;i<10;i++){
			same+=a[i];
		}
		if(same==n){
			break;
		}
		y++;
	}
	printf("%d %04d",y-m,y);
	return 0;
}

L1-034 点赞 (20 分)
微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。本题就要求你写个程序,通过统计一个人点赞的纪录,分析这个人的特性。

输入格式:
输入在第一行给出一个正整数N(≤1000),是该用户点赞的博文数量。随后N行,每行给出一篇被其点赞的博文的特性描述,格式为“K F​1⋯FK​​ ”,其中1≤K≤10,F​i(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<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;
	int b[1001]={0};
	while(n--){
		int x;
		int a[11]={0}; 
		cin>>x;
		for(int i=0;i<x;i++){
			cin>>a[i];
			b[a[i]]++;
		}
	}
	int max=0;
	int space=0;
	for(int i=1000;i>=0;i--){
		if(b[i]>max){
			max=b[i];
			space=i;
			
		}
	}
	cout<<space<<" "<<b[space];
	return 0;
} 

以上是朋友圈中一奇葩贴:“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<bits/stdc++.h>
using namespace std;
int main(){
	char s[11];
	char a[11],b[11];
	int sum=0;
	while(cin>>s){
		if(s[0]=='.') break;
		sum++;
		if(sum==2){
			strcpy(a,s);
		}
		if(sum==14){
			strcpy(b,s);
		}
	}
	if(sum<2){
		cout<<"Momo... No one is for you ...";
	}
	else if(sum>=2&&sum<14){
		printf("%s is the only one for you...",a);
	}
	else{
		printf("%s and %s are inviting you to dinner...",a,b);
	}
	return 0;
} 

L1-036 A乘以B (5 分)
看我没骗你吧 —— 这是一道你可以在 10 秒内完成的题:给定两个绝对值不超过 100 的整数 A 和 B,输出 A 乘以 B 的值。

输入格式:
输入在第一行给出两个整数 A 和 B(−100≤A,B≤100),数字间以空格分隔。

输出格式:
在一行中输出 A 乘以 B 的值。

输入样例:
-8 13
输出样例:
-104

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a,b;
	cin>>a>>b;
	cout<<a*b;
	return 0;
}

L1-037 A除以B (10 分)
真的是简单题哈 —— 给定两个绝对值不超过100的整数A和B,要求你按照“A/B=商”的格式输出结果。

输入格式:
输入在第一行给出两个整数A和B(−100≤A,B≤100),数字间以空格分隔。

输出格式:
在一行中输出结果:如果分母是正数,则输出“A/B=商”;如果分母是负数,则要用括号把分母括起来输出;如果分母为零,则输出的商应为Error。输出的商应保留小数点后2位。

输入样例1:
-1 2
输出样例1:
-1/2=-0.50
输入样例2:
1 -3
输出样例2:
1/(-3)=-0.33
输入样例3:
5 0
输出样例3:
5/0=Error

#include<bits/stdc++.h>
using namespace std;
int main(){
	double a,b;
	cin>>a>>b;
	if(b<0){
		printf("%.lf/(%.lf)=%.2lf",a,b,a/b);
	}
	else if(b==0){
		printf("%.lf/%.lf=Error",a,b);
	}
	else{
		printf("%.lf/%.lf=%.2lf",a,b,a/b);
	}
	return 0;
}

L1-038 新世界 (5 分)
这道超级简单的题目没有任何输入。

你只需要在第一行中输出程序员钦定名言“Hello World”,并且在第二行中输出更新版的“Hello New World”就可以了。

输入样例:

输出样例:
Hello World
Hello New World

#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"Hello World"<<"\n";
	cout<<"Hello New World";
}

L1-039 古风排版 (20 分)
中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。

输入格式:
输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。

输出格式:
按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。

输入样例:
4
This is a test case
输出样例:
asa T
st ih
e t si
ce s
这道题的难点是建立b[i][j]

for(int j=m-1;j>=0;j--){
		for(int i=0;i<n;i++){
			if(p<l) b[i][j]=a[p++];
			else b[i][j]=' ';//不知道来干什么的,但是删去就是错误的 
		}
	}
#include<bits/stdc++.h>
using namespace std;
char b[101][1005];
int main(){
	int n;
	cin>>n;
	scanf("\n");
	string a;
	getline(cin,a);
	int l=a.length();
	int m=l/n;
	if(l%n!=0) m++;
	int p=0;
	for(int j=m-1;j>=0;j--){
		for(int i=0;i<n;i++){
			if(p<l) b[i][j]=a[p++];
			else b[i][j]=' ';//用来把矩阵填满
		}
	}
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			cout<<b[i][j];
		}
		cout<<"\n";
	} 
	return 0;
}

L1-040 最佳情侣身高差 (10 分)
专家通过多组情侣研究数据发现,最佳的情侣身高差遵循着一个公式:(女方的身高)×1.09 =(男方的身高)。如果符合,你俩的身高差不管是牵手、拥抱、接吻,都是最和谐的差度。

下面就请你写个程序,为任意一位用户计算他/她的情侣的最佳身高。

输入格式:
输入第一行给出正整数N(≤10),为前来查询的用户数。随后N行,每行按照“性别 身高”的格式给出前来查询的用户的性别和身高,其中“性别”为“F”表示女性、“M”表示男性;“身高”为区间 [1.0, 3.0] 之间的实数。

输出格式:
对每一个查询,在一行中为该用户计算出其情侣的最佳身高,保留小数点后2位。

输入样例:
2
M 1.75
F 1.8
输出样例:
1.61
1.96

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;
	while(n--){
		char x;
		double num;
		cin>>x>>num;
		if(x=='M'){
			printf("%.2lf",num/1.09);
		}else{
			printf("%.2lf",num*1.09);
		}
		cout<<"\n";
	}
	return 0;
}

对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。

输入格式:
输入在一行中给出不知道多少个绝对值不超过1000的整数,其中保证至少存在一个“250”。

输出格式:
在一行中输出第一次出现的“250”是对方扔过来的第几个数字(计数从1开始)。题目保证输出的数字在整型范围内。

输入样例:
888 666 123 -233 250 13 250 -222
输出样例:
5

#include<bits/stdc++.h>
using namespace std;
int main(){
	int x;
	int num=0;
	while(cin>>x){
		num++;
		if(x==250){
			cout<<num;
			break;
		}
	}
	return 0;
}

L1-042 日期格式化 (5 分)
世界上不同国家有不同的写日期的习惯。比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”。下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期。

输入格式:
输入在一行中按照“mm-dd-yyyy”的格式给出月、日、年。题目保证给出的日期是1900年元旦至今合法的日期。

输出格式:
在一行中按照“yyyy-mm-dd”的格式给出年、月、日。

输入样例:
03-15-2017
输出样例:
2017-03-15

#include<bits/stdc++.h>
using namespace std;
int main(){
	char a[100]={0};
	cin>>a;
	cout<<a[6]<<a[7]<<a[8]<<a[9]<<a[5]<<a[0]<<a[1]<<a[2]<<a[3]<<a[4]; 
	return 0;
}

43
L1-043 阅览室 (20 分)
天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下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
输入注意
scanf("%d %c %d:%d",&number,&a,&h,&m)可以输入08:10等的时间
经过了多少时间

s[number]=h*60+m;
time+=h*60+m-s[number];

输出注意
double数据中不保留小数的时候,它会根据后面的小数自动进位

printf("%d %.0lf\n",k,(double)time/k);
#include<bits/stdc++.h>
using namespace std;
int n,number,h,m,s[100005],f[100005];
char a;
int main(){
	cin>>n;
	getchar();
	while(n--){
		int k=0;
		int time=0;
		memset(s,0,sizeof(s));
        memset(f,0,sizeof(f));
        while(~scanf("%d %c %d:%d",&number,&a,&h,&m))
		{	
			if(number==0) break;
			getchar();
        	if(a=='S'){
        		f[number]=1;
        		s[number]=h*60+m;
			}else{
				if(f[number]==1){
					f[number]=0;
					k++;//表示的是既有s又有e 
					time+=h*60+m-s[number];
				}
			}
		}
		if(k==0){
			cout<<"0 0"<<endl;
		}
		else{
			printf("%d %.0lf\n",k,(double)time/k);
		}	
	}
	return 0;
}

44
现要求你编写一个稳赢不输的程序,根据对方的出招,给出对应的赢招。但是!为了不让对方输得太惨,你需要每隔K次就让一个平局。

输入格式:
输入首先在第一行给出正整数K(≤10),即平局间隔的次数。随后每行给出对方的一次出招:ChuiZi代表“锤子”、JianDao代表“剪刀”、Bu代表“布”。End代表输入结束,这一行不要作为出招处理。

输出格式:
对每一个输入的出招,按要求输出稳赢或平局的招式。每招占一行。

输入样例:
2
ChuiZi
JianDao
Bu
JianDao
Bu
ChuiZi
ChuiZi
End
输出样例:
Bu
ChuiZi
Bu
ChuiZi
JianDao
ChuiZi
Bu

#include<bits/stdc++.h>
using namespace std;
int main(){
	int k;
	cin>>k;
	int m=k;
	string a;
	while(cin>>a){
		if(a[0]=='E') break;
		m--;
		if(m==-1){
			cout<<a<<"\n";
			m=k;
			continue;
		}
		if(a[0]=='C'){
			cout<<"Bu"<<"\n";
		}else if(a[0]=='J')
			cout<<"ChuiZi"<<"\n";
			else cout<<"JianDao"<<"\n";
	}
	return 0;
}

L1-045 宇宙无敌大招呼 (5 分)
据说所有程序员学习的第一个程序都是在屏幕上输出一句“Hello World”,跟这个世界打个招呼。作为天梯赛中的程序员,你写的程序得高级一点,要能跟任意指定的星球打招呼。

输入格式:
输入在第一行给出一个星球的名字S,是一个由不超过7个英文字母组成的单词,以回车结束。

输出格式:
在一行中输出Hello S,跟输入的S星球打个招呼。

输入样例:
Mars
输出样例:
Hello Mars

#include<bits/stdc++.h>
using namespace std;
int main(){
	string a;
	cin>>a;
	cout<<"Hello "<<a;
	return 0;
}

L1-046 整除光棍 (20 分)
这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s,表示x乘以s是一个光棍,第二个数字n是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。

提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除x为止。但难点在于,s可能是个非常大的数 —— 比如,程序输入31,那么就输出3584229390681和15,因为31乘以3584229390681的结果是111111111111111,一共15个1。

输入格式:
输入在一行中给出一个不以5结尾的正奇数x(<1000)。

输出格式:
在一行中输出相应的最小的s和n,其间以1个空格分隔。

输入样例:
31
输出样例:
3584229390681 15
错误代码(暴力方法),容易超时

#include<bits/stdc++.h>
using namespace std;
int main(){
	int x;
	cin>>x;
	long long int y=1;
	int sum=0;
	while(1){
		sum++;
		if(y%x==0){
			cout<<y/x<<" "<<sum;
			break;
		}else{
			y=y*10+1;
		}
	}
	
	return 0;
}

正确代码
运用了数学的方法,就是怎么算除法的
模拟除法
此题非常巧妙的计算除法

	while(1)
	{
        if(ans==0)
        break;
        if(ans%n==0)
        {
	       printf("%lld",ans/n);
		   break;
	    }
        else
        {
		   printf("%lld",ans/n);//先开始是111/31==3
		   ans=ans%n;//余数是18
		   ans=ans*10+1;//ans==181
		   cnt++;
	    }
	}
#include<cstdio>
using namespace std;
typedef long long ll;
int main()
{
	ll ans=1;
	ll n;
	ll cnt=1;
	scanf("%lld",&n);
	while(ans<n)
    {
	  ans=10*ans+1;//先找到最接近的光棍数
	  cnt++;
    }
	while(1)
	{
        if(ans==0)
        break;
        if(ans%n==0)
        {
	       printf("%lld",ans/n);
		   break;
	    }
        else
        {
		   printf("%lld",ans/n);
		   ans=ans%n;
		   ans=ans*10+1;
		   cnt++;
	    }
	}
	printf(" %lld",cnt);
	return 0;
}

L1-047 装睡 (10 分)
你永远叫不醒一个装睡的人 —— 但是通过分析一个人的呼吸频率和脉搏,你可以发现谁在装睡!医生告诉我们,正常人睡眠时的呼吸频率是每分钟15-20次,脉搏是每分钟50-70次。下面给定一系列人的呼吸频率与脉搏,请你找出他们中间有可能在装睡的人,即至少一项指标不在正常范围内的人。

输入格式:
输入在第一行给出一个正整数N(≤10)。随后N行,每行给出一个人的名字(仅由英文字母组成的、长度不超过3个字符的串)、其呼吸频率和脉搏(均为不超过100的正整数)。

输出格式:
按照输入顺序检查每个人,如果其至少一项指标不在正常范围内,则输出其名字,每个名字占一行。

输入样例:
4
Amy 15 70
Tom 14 60
Joe 18 50
Zoe 21 71
输出样例:
Tom
Zoe

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;
	while(n--){
		string s;
		int x,y;
		cin>>s>>x>>y;
		if((x>=15&&x<=20)&&(y>=50&&y<=70)) continue;
		cout<<s<<endl;
	}
	return 0;
}

L1-048 矩阵A乘以B (15 分)
给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有R​a行、Ca列,B有R​b行、Cb列,则只有Ca与Rb相等时,两个矩阵才能相乘。

输入格式:
输入先后给出两个矩阵A和B。对于每个矩阵,首先在一行中给出其行数R和列数C,随后R行,每行给出C个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的R和C都是正数,并且所有整数的绝对值不超过100。

输出格式:
若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵AB,否则输出Error: Ca != Rb,其中Ca是A的列数,Rb是B的行数。

输入样例1:
2 3
1 2 3
4 5 6
3 4
7 8 9 0
-1 -2 -3 -4
5 6 7 8
输出样例1:
2 4
20 22 24 16
53 58 63 28
输入样例2:
3 2
38 26
43 -5
0 17
3 2
-11 57
99 68
81 72
输出样例2:
Error: 2 != 3
这个问题涉及到了矩阵的乘法

所以这道题
矩阵乘法标准代码

if(ca!=rb){
		printf("Error: %d != %d",ca,rb);
	}
	else{
		for(int a = 0; a < ra; a ++)
        {
            for(int b = 0; b < cb; b ++)
            {
                for(int c = 0; c < rb; c ++)
                    sum[a][b]=sum[a][b]+x[a][c]*y[c][b];
            }
        }
        cout<<ra<<" "<<cb<<"\n";
		for(int a = 0; a < ra; a ++){
			for(int b = 0; b < cb; b ++){
				printf(b==cb-1?"%d\n":"%d ",sum[a][b]);//输出的时候也要十分注意,每排的最后一个数字后面没有空格,并且有一个回车
			}
		}
	}
#include<bits/stdc++.h>
using namespace std;
int x[105][105],y[105][105];
int sum[105][105];
int main(){
	memset(sum,0,sizeof(sum));
	memset(x,0,sizeof(x));
	memset(y,0,sizeof(y));
	int ra,ca,rb,cb;
	
	
	cin>>ra>>ca;
	for(int i=0;i<ra;i++){
		for(int j=0;j<ca;j++){
			cin>>x[i][j];
		}
	}
	cin>>rb>>cb;
	for(int i=0;i<rb;i++){
		for(int j=0;j<cb;j++){
			cin>>y[i][j];
		}
	}
	
	if(ca!=rb){
		printf("Error: %d != %d",ca,rb);
	}
	else{
		for(int a = 0; a < ra; a ++)
        {
            for(int b = 0; b < cb; b ++)
            {
                for(int c = 0; c < rb; c ++)
                    sum[a][b]=sum[a][b]+x[a][c]*y[c][b];
            }
        }
        cout<<ra<<" "<<cb<<"\n";
		for(int a = 0; a < ra; a ++){
			for(int b = 0; b < cb; b ++){
				printf(b==cb-1?"%d\n":"%d ",sum[a][b]);
			}
		}
	}
	
	return 0;
}

L1-050 倒数第N个字符串 (15 分)
给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 L,从 L 个 a 开始,以 1 为步长递增。例如当 L 为 3 时,序列为 { aaa, aab, aac, …, aaz, aba, abb, …, abz, …, zzz }。这个序列的倒数第27个字符串就是 zyz。对于任意给定的 L,本题要求你给出对应序列倒数第 N 个字符串。

输入格式:
输入在一行中给出两个正整数 L(2 ≤ L ≤ 6)和 N(≤10
​5
​​ )。

输出格式:
在一行中输出对应序列倒数第 N 个字符串。题目保证这个字符串是存在的。

输入样例:
3 7417
输出样例:
pat
题解:本题本质上是将10进制整数转换为26进制。其中a表示0,z表示25,如:aaa可以看做000,zzz表示(25)(25)(25)转换为10进制就是26^3-1.

十进制的取个数
int i=0;
while(1){
	a[i++]=n%10;
	n/=10;
	}
同理把它看成是26进制的
while(len--){
		a[len]=n%26;
		n/=26;
	}
for(int i=0;i<l;i++)printf("%c",'a'+a[i]);
#include<bits/stdc++.h> 
using namespace std;
void find(int a[],int l,int n){
	int len=l;
	while(len--){
		a[len]=n%26;
		n/=26;
	}
	for(int i=0;i<l;i++)printf("%c",'a'+a[i]);
	cout<<"\n";
}
int main(){
	int a[10]={0},l,n;
	cin>>l>>n;
	int m=pow(26,l)-n;  //计算顺数第几个数字
	find(a,l,m);
	return 0;
}

L1-051 打折 (5 分)
去商场淘打折商品时,计算打折以后的价钱是件颇费脑子的事情。例如原价 ¥988,标明打 7 折,则折扣价应该是 ¥988 x 70% = ¥691.60。本题就请你写个程序替客户计算折扣价。

输入格式:
输入在一行中给出商品的原价(不超过1万元的正整数)和折扣(为[1, 9]区间内的整数),其间以空格分隔。

输出格式:
在一行中输出商品的折扣价,保留小数点后 2 位。

输入样例:
988 7
输出样例:
691.60

#include<bits/stdc++.h>
using namespace std;
int main(){
	double n,m;
	cin>>n>>m;
	printf("%.2lf",n*m/10);
	return 0;
}

L1-052 2018我们要赢 (5 分)
2018年天梯赛的注册邀请码是“2018wmyy”,意思就是“2018我们要赢”。本题就请你用汉语拼音输出这句话。

输入格式:
本题没有输入。

输出格式:
在第一行中输出:“2018”;第二行中输出:“wo3 men2 yao4 ying2 !”。

输入样例:

输出样例:
2018
wo3 men2 yao4 ying2 !

#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"2018"<<"\n";
	cout<<"wo3 men2 yao4 ying2 !";
	return 0;
}

L1-053 电子汪 (10 分)
据说汪星人的智商能达到人类 4 岁儿童的水平,更有些聪明汪会做加法计算。比如你在地上放两堆小球,分别有 1 只球和 2 只球,聪明汪就会用“汪!汪!汪!”表示 1 加 2 的结果是 3。

本题要求你为电子宠物汪做一个模拟程序,根据电子眼识别出的两堆小球的个数,计算出和,并且用汪星人的叫声给出答案。

输入格式:
输入在一行中给出两个 [1, 9] 区间内的正整数 A 和 B,用空格分隔。

输出格式:
在一行中输出 A + B 个Wang!。

输入样例:
2 1
输出样例:
Wang!Wang!Wang!

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a,b;
	cin>>a>>b;
	int m=a+b;
	while(m--){
		cout<<"Wang!";
	}
	return 0;
}

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

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

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

输入样例 1:
$ 9
@ @@@@@
@@@ @@@
@ @ @
@@@ @@@
@@@ @@@@@
@@@ @ @ @
@@@ @@@@@
@ @ @ @
@ @@@@@
输出样例 1:
$$$KaTeX parse error: Can't use function '$' in math mode at position 3: $̲ $ $ $ $ $ $
$ $ $ $ $ $
$ $
$ $ $
$ $
$$$$$ $
输入样例 2:
& 3
@@@
@
@@@
输出样例 2:
bu yong dao le
&&&
&
&&&
输入注意
当存在多个输入的时候要求有 getchar()
含有空格的字符串的输入
getline(cin,s);

//题目思路: 
//我们已给定的图形的中点为坐标原点,水平方向为x轴,纵方向为y轴,建立直角坐标系。容易观察到,倒过来的图形就是通过原图形先经过x轴旋转180度,再经过y轴旋转180度得到的。
//
//例如: 
//n*n的图形中,坐标(i, j)经过“倒“操作后,得到的坐标就是(n-i+1, n-j+1)。 
//反过来也是一样的,即坐标(n-i+1, n-j+1)经过“倒“操作后,得到的坐标就是(i, j)。
//
//判断“倒“过来的图形是否和原来的图形是否相同,可以通过判断对应坐标是否都相同来求解。
#include<bits/stdc++.h>
using namespace std;
string s[150];
int main(){
	char x;
	cin>>x;
	getchar();
	int n;
	cin>>n;
	getchar();
	for(int i=0;i<n;i++){
		getline(cin,s[i]);
	}
	bool issame=true;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			int ii=n-i-1;
			int jj=n-1-j;
			if(s[i][j]!=s[ii][jj]){
			issame=false;
			}
		}
	}
	if(issame){
		cout<<"bu yong dao le\n";
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				if(s[i][j]!=' ')
				printf("%c",x);
				else cout<<" ";
			}
			cout<<endl;
		}
	}
	else{
		for(int i=n-1;i>=0;i--){
			for(int j=n-1;j>=0;j--){
				if(s[i][j]!=' ')
				printf("%c",x);
				else cout<<" ";
			}
			cout<<endl;
		}
	}
	return 0;
}

L1-055 谁是赢家 (10 分)
某电视台的娱乐节目有个表演评审环节,每次安排两位艺人表演,他们的胜负由观众投票和 3 名评委投票两部分共同决定。规则为:如果一位艺人的观众票数高,且得到至少 1 名评委的认可,该艺人就胜出;或艺人的观众票数低,但得到全部评委的认可,也可以胜出。节目保证投票的观众人数为奇数,所以不存在平票的情况。本题就请你用程序判断谁是赢家。

输入格式:
输入第一行给出 2 个不超过 1000 的正整数 Pa 和 Pb,分别是艺人 a 和艺人 b 得到的观众票数。题目保证这两个数字不相等。随后第二行给出 3 名评委的投票结果。数字 0 代表投票给 a,数字 1 代表投票给 b,其间以一个空格分隔。

输出格式:
按以下格式输出赢家:

The winner is x: P1 + P2
其中 x 是代表赢家的字母,P1 是赢家得到的观众票数,P2 是赢家得到的评委票数。

输入样例:
327 129
1 0 1
输出样例:
The winner is a: 327 + 1

#include<bits/stdc++.h>
using namespace std;
int main(){
	int pa,pb;
	cin>>pa>>pb;
	int a[3]={0};
	int ba=0,bb=0;
	for(int i=0;i<3;i++){
		cin>>a[i];
		if(a[i]==0) ba++;
		else bb++;
	}
	if(pa>pb){
		if(ba>0) printf("The winner is a: %d + %d",pa,ba);
		else{
			printf("The winner is b: %d + %d",pb,bb);
		}
	}
	else{
		if(bb>0) printf("The winner is b: %d + %d",pb,bb);
		else printf("The winner is a: %d + %d",pa,ba);
	}
	return 0;
}

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

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

输出格式:
在一行中顺序输出:大家平均数的一半(只输出整数部分)、赢家的名字,其间以空格分隔。题目保证赢家是唯一的。
输入样例:
7
Bob 35
Amy 28
James 98
Alice 11
Jack 45
Smith 33
Chris 62
输出样例:
22 Amy

#include<bits/stdc++.h>
using namespace std;
struct node{
	string s;
	double num;
}a[150];
int main(){
	int n;
	cin>>n;
	double sum=0;
	for(int i=0;i<n;i++){
		cin>>a[i].s;
		cin>>a[i].num;
		sum+=a[i].num;
	}
	double avr=sum/n/2;
	int space=0;
	double min=abs(a[0].num-avr);
	for(int i=1;i<n;i++){
		if(min>abs(a[i].num-avr)){
			min=abs(a[i].num-avr);
			space=i;
		}
	}
	printf("%.lf ",avr);
	cout<<a[space].s;
	
	
	
	return 0;
} 

L2-001 紧急救援 (25 分)
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。

输入格式:
输入第一行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0 ~ (N−1);M是快速道路的条数;S是出发地的城市编号;D是目的地的城市编号。

第二行给出N个正整数,其中第i个数是第i个城市的救援队的数目,数字间以空格分隔。随后的M行中,每行给出一条快速道路的信息,分别是:城市1、城市2、快速道路的长度,中间用空格分开,数字均为整数且不超过500。输入保证救援可行且最优解唯一。

输出格式:
第一行输出最短路径的条数和能够召集的最多的救援队数量。第二行输出从S到D的路径中经过的城市编号。数字间以空格分隔,输出结尾不能有多余空格。

输入样例:
4 5 0 3
20 30 40 10
0 1 1
1 3 2
0 3 3
0 2 2
2 3 2
输出样例:
2 60
0 1 3
此题运用了Dijstra算法

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
 
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 505;
int e[MAXN][MAXN],weight[MAXN],n,m,s,en;
int dis[MAXN],w[MAXN],num[MAXN];
int pre[MAXN];
bool vis[MAXN];
 
 
void Dijkstra(int s){
  
  for(int i = 0; i < n; i++){
    num[i] = 0;
    w[i] = 0;
    vis[i] = 0;
    dis[i] = INF;
  }
  memset(dis,INF,sizeof(dis));
  w[s] = weight[s];
  num[s] = 1;
  dis[s] = 0;
 
  for(int i = 0; i < n - 1; i++){
    int min = INF;
    int u = -1;
    for(int j = 0; j < n; j++){
      if(vis[j] == 0 && dis[j] < min){
        min = dis[j];
        u = j;
      }
    }
    if(u == -1){
      break;
    }
    vis[u] = 1;
    for(int v = 0; v < n; v++){
      if(!vis[v] && e[u][v] != INF){
        if(dis[v] > dis[u] + e[u][v]){
          dis[v] = dis[u] + e[u][v];
          num[v] = num[u];
          w[v] = w[u] + weight[v];
          pre[v] = u;
        }
        else if(dis[v] == dis[u] + e[u][v]){
          num[v] = num[v] + num[u];
             if(w[v] < w[u] + weight[v]){
             w[v] = w[u] + weight[v];
             pre[v] = u;
            }
            }
        }
       }
  }
}
 
int main(void){
  cin>>n>>m;
  cin >> s >> en;
  for(int i = 0; i < n; i++){
    cin >> weight[i];
  }
  memset(e,INF,sizeof(e));
  for(int i = 0; i < m; i++){
    int a,b,w;
    cin >> a >> b >> w;
    e[a][b] = e[b][a] = min(e[b][a],w);
  }
  Dijkstra(s);
  int i = 0,path[505],cur = en;
  while(cur != s){
    path[i++] = cur;
    cur = pre[cur];
  }
  cout<<num[en]<<" "<<w[en]<<endl;
  path[i] = s;
  for(int j = i; j > 0; j--){
    printf("%d ",path[j]);
  }
  printf("%d\n",en);
  return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43646600/article/details/88070951