【PAT】1041/1004/1028/1032/1036/1027

22 篇文章 0 订阅
/*
*时间:2018年4月3日08:30:11-2018年4月3日09:04:28
*题号:1041. 考试座位号
*语言:C++ (g++ 4.7.2)
*分数:15
*题目描述:

每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入
场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试
座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的
考试座位号码。

输入格式:

输入第一行给出一个正整数N(<=1000),随后N行,每行给出一个考生的信息:“准考证号 试机座位号 考试座位号”。其中准考证号由14位数字组成,座位从1到N编号。输入保证每个人的准考证号都不同,并且任何时候都不会把两个人分配到同一个座位上。

考生信息之后,给出一个正整数M(<=N),随后一行中给出M个待查询的试机座位号码,以空格分隔。

输出格式:

对应每个需要查询的试机座位号码,在一行中输出对应考生的准考证号和考试座位号码,中间用1个空格分隔。
输入样例:

4
10120150912233 2 4
10120150912119 4 1
10120150912126 1 3
10120150912002 3 2
2
3 4

输出样例:

10120150912002 2
10120150912119 1

*/

#include <iostream>
using namespace std;

int main()
{
	int N;
	cin>>N;
	struct student
	{
		long long ID;
		int S;
		int K;
	}num[N];	
	//student* num[N];
	int i;
	for (i=0; i<N; i++)
	{
		cin>>num[i].ID;
		cin>>num[i].S;
		cin>>num[i].K;	
	}
	int M;
	cin>>M;
	int choucha[M];                //抽查的试机位置号
	for (i=0; i<M; i++)
	{
		cin>>choucha[i];
	}
	int j;
	for (j=0; j<M; j++)
	{
		for (i=0; i<N; i++)
			if (num[i].S == choucha[j])
				cout<<num[i].ID<<" "<<num[i].K<<endl;
	}
	
	return 0;
}



/*
*时间:2018年4月3日12:42:46-2018年4月3日12:59:06
*题号:1004. 成绩排名
*语言:C++ (g++ 4.7.2)
*分数:20
*题目描述:

读入n名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。

输入格式:每个测试输入包含1个测试用例,格式为

  第1行:正整数n
  第2行:第1个学生的姓名 学号 成绩
  第3行:第2个学生的姓名 学号 成绩
  ... ... ...
  第n+1行:第n个学生的姓名 学号 成绩

其中姓名和学号均为不超过10个字符的字符串,成绩为0到100之间的一个整数,这里保证在一组测试用例中没有
两个学生的成绩是相同的。

输出格式:对每个测试用例输出2行,第1行是成绩最高学生的姓名和学号,第2行是成绩最低学生的姓名和学号,
字符串间有1空格。
输入样例:

3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95

输出样例:

Mike CS991301
Joe Math990112

*/

#include <iostream>
#include <string.h>
using namespace std;

int main()
{
	int n;
	cin>>n;
	int maxScore = 0;
	int minScore = 100;
	int numMinSocre = 0;
	int numMaxSocre = 0;
	struct student                 //结构体快速初始化方法
	{
		string name;
		string project;
		int score;
	}stu[n];
	
	for (int i=0; i<n; i++)
	{
		cin>>stu[i].name>>stu[i].project>>stu[i].score;
	}
	
	for (int i=0; i<n; i++)
	{
		if (stu[i].score > maxScore)
		{
			maxScore = stu[i].score;
			numMaxSocre = i;
		}
		if (stu[i].score < minScore)
		{
			minScore = stu[i].score;
			numMinSocre = i;
		}
	}
	
	cout<<stu[numMaxSocre].name<<" "<<stu[numMaxSocre].project<<endl;
	cout<<stu[numMinSocre].name<<" "<<stu[numMinSocre].project<<endl;
	
	return 0;

}



/*
*时间:2018年4月3日15:00:46-2018年4月3日15:58:13
*题号:1028. 人口普查
*语言:C++ (g++ 4.7.2)
*分数:20
*题目描述:

某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。

这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过200岁的老人,而今天是
2014年9月6日,所以超过200岁的生日和未出生的生日都是不合理的,应该被过滤掉。

输入格式:

输入在第一行给出正整数N,取值在(0, 105];随后N行,每行给出1个人的姓名(由不超过5个英文字母组成的
字符串)、以及按“yyyy/mm/dd”(即年/月/日)格式给出的生日。题目保证最年长和最年轻的人没有并列。

输出格式:

在一行中顺序输出有效生日的个数、最年长人和最年轻人的姓名,其间以空格分隔。
输入样例:

5
John 2001/05/12
Tom 1814/09/06
Ann 2121/01/30
James 1814/09/05
Steve 1967/11/20

输出样例:

3 Tom John

*/

#include <iostream>
#include <string>
using namespace std;

struct population
{
	string name;
	string birthday;
	float ageDays;
};
//将输入的string类型的年月日转化为float类型的存活的天数
float agedaysStr2Float (struct population ppl)
{
	int year = (ppl.birthday[0] - '0')*1000 + (ppl.birthday[1] - '0')*100 + (ppl.birthday[2] - '0')*10 + (ppl.birthday[3] - '0')*1;
	int mon = ((ppl.birthday[5] - '0')*10) + (ppl.birthday[6] - '0')*1;
	int day = (ppl.birthday[8] - '0')*10 + (ppl.birthday[9] - '0')*1;
	return ((2014 - year)*365 + (9 - mon)*30 + 6 - day + 1);  //生下来就算一天,所以+1
}

int main()
{
	int n;
	cin>>n;
	struct population ppl[n];          //定义结构体数组,也可用指针的形式
	for (int i=0; i<n; i++)
	{
		cin>>ppl[i].name>>ppl[i].birthday;
	}
	for (int i=0; i<n; i++)
	{
		ppl[i].ageDays = agedaysStr2Float(ppl[i]);
		//cout<<ppl[i].ageDays<<endl;
	}
	float minAge = 200*365 + 1;
	int flagMinAge = 0;
	float maxAge = 0;
	int flagMaxAge = 0;
	int pplCount = 0;
	for (int i=0; i<n; i++)
	{
		if (!(0<ppl[i].ageDays && ppl[i].ageDays <= 200*365 + 1))    //年龄天数要大于0小于73001
			continue;
		//cout<<ppl[i].ageDays<<endl;
		if (ppl[i].ageDays > maxAge)
		{
			maxAge = ppl[i].ageDays;
			flagMaxAge = i;
		}
		if (ppl[i].ageDays < minAge)
		{
			minAge = ppl[i].ageDays;
			flagMinAge = i;
		}
		pplCount++;
	}
	if (pplCount == 0) cout<<"0"<<endl; //全镇都是死人或者没出生的情况,输出0就跳过,坑爹啊谁会想没有一个活人
	else cout<<pplCount<<" "<<ppl[flagMaxAge].name<<" "<<ppl[flagMinAge].name<<endl;
	return 0;
}



/*
*时间:2018年4月3日15:58:54-2018年4月3日16:27:53
*题号:1032. 挖掘机技术哪家强
*语言:C++ (g++ 4.7.2)
*分数:20
*题目描述:

为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强
的那个学校。

输入格式:

输入在第1行给出不超过105的正整数N,即参赛人数。随后N行,每行给出一位参赛者的信息和成绩,包括其所代
表的学校的编号(从1开始连续编号)、及其比赛成绩(百分制),中间以空格分隔。

输出格式:

在一行中给出总得分最高的学校的编号、及其总分,中间以空格分隔。题目保证答案唯一,没有并列。
输入样例:

6
3 65
2 80
1 100
2 70
3 40
3 0

输出样例:

2 150
*/


#include <iostream>
using namespace std;

int main()
{
	int n;
	cin>>n;
	struct participant
	{
		int school;
		int score;
	}pat[n];
	
	int scoreSchool[n+1] = {0};
	
	for (int i=0; i<n; i++)
	{
		cin>>pat[i].school>>pat[i].score;
	}
	
	for (int i=0; i<n; i++)                                  
	{
		scoreSchool[pat[i].school] += pat[i].score;
	}
	
	int maxSchoolNum = 0;
	int maxSchoolSocre = 0;
	
	for (int i=1; i<=n; i++)                  //学校编号是1-n,不能用i<n,会漏掉第n个学校
	{
		if (scoreSchool[i] > maxSchoolSocre)
		{
			maxSchoolSocre = scoreSchool[i];
			maxSchoolNum = i;
		}
	}
	
	cout<<maxSchoolNum<<" "<<maxSchoolSocre<<endl;
	return 0;
}



/*
*时间:2018年4月3日16:38:08-2018年4月3日17:00:01
*题号:1036. 跟奥巴马一起编程
*语言:C++ (g++ 4.7.2)
*分数:15
*题目描述:

美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的
总统。2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个
正方形。现在你也跟他一起画吧!

输入格式:

输入在一行中给出正方形边长N(3<=N<=20)和组成正方形边的某种字符C,间隔一个空格。

输出格式:

输出由给定字符C画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出
的行数实际上是列数的50%(四舍五入取整)。
输入样例:

10 a

输出样例:

aaaaaaaaaa
a        a
a        a
a        a
aaaaaaaaaa


*/

#include<iostream>
using namespace std;

int main(void)
{
	int n;
	cin>>n;
	char C;
	cin>>C;
	int lines;
	if (n % 2 == 1)	lines = n/2 + 1;
	else lines = n / 2;
	//cout<<lines<<endl;
	for (int i=1; i<=lines; i++)
	{
		if (i == 1)
		{
			for (int j=0; j<n; j++)
				cout<<C;
			cout<<endl;
		}
		else if (i == lines)
		{
			for (int j=0; j<n; j++)
				cout<<C;
		}
		else 
		{
			cout<<C;
			for (int j=1; j<n-1; j++)
				cout<<" ";
			cout<<C;
			cout<<endl;
		}
	}
	
	return 0;
}




/*
*时间:2018年4月3日19:02:41-2018年4月3日20:01:18
*题号:1027. 打印沙漏
*语言:C++ (g++ 4.7.2)
*分数:20
*题目描述:

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****
 ***
  *
 ***
*****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:

19 *

输出样例:

*****
 ***
  *
 ***
*****
2

*/

#include <iostream>
using namespace std;

int main()
{
	int n;
	char C;                    
	cin>>n>>C;
	
	int line = 0;
	//设一个三角形的行数为n,则总共用掉的符号为2n*2-1个,最多为1000个,则三角形的行数小于23
	for (int i=1; i<25; i++)    
	{
		if (n >= 2*i*i-1 && n < 2*(i+1)*(i+1)-1)  //用2i^2-1<=n<2(i+1)^2-1来计算整数line,也可用向下取整的sqrt
		{
			line = i;
			break;
		}
	}
	//cout<<line<<endl;
	int res = (line == 0)? 0: (n - 2*line*line + 1);   //行数为0时,剩下的输出的应该是0(后面式子不适用行数为0),不为0时输出的是n- 2line^2 +1
	if (line == 1)            //行数为1时输出的输出单个符号,下面是用于行数为2及以上
	{
		cout<<C<<endl;
	}
	else
	{
		for (int i=line; i > 0; i--)
		{
			for(int j=0; j<line-i; j++)
			{
				cout<<" ";
			}
			for(int j=2*i-1; j>=1; j--)
			{
				cout<<C;
			}
			//for(int j=0; j<line-i; j++)   不用打印右边的括号!!自己想复杂了,检查了半小时
			//{
			//	cout<<" ";
			//}
			cout<<endl;
		}
		for (int i=2; i <=line; i++)
		{
			for(int j=0; j<line-i; j++)
			{
				cout<<" ";
			}
			for(int j=2*i-1; j>=1; j--)
			{
				cout<<C;
			}
			//for(int j=0; j<line-i; j++)
			//{
			//	cout<<" ";
			//}
			cout<<endl;
		}
	}
	cout<<res<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值