PAT (Basic Level) Practice 乙级1046-1050

制作不易,大家的点赞和关注就是我更新的动力!

由于这些题全是大一寒假刷的,部分还是c语言,部分的解题方法比较复杂,希望大家体谅。有问题欢迎大家在评论区讨论,有不足也请大家指出,谢谢大家!

温馨提示:可以点目录跳转到相应题目哦。

1046 划拳

分数 15

作者 CHEN, Yue

单位 浙江大学

划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。

下面给出甲、乙两人的划拳记录,请你统计他们最后分别喝了多少杯酒。

输入格式:

输入第一行先给出一个正整数 N(≤100),随后 N 行,每行给出一轮划拳的记录,格式为:

甲喊 甲划 乙喊 乙划

其中是喊出的数字,是划出的数字,均为不超过 100 的正整数(两只手一起划)。

输出格式:

在一行中先后输出甲、乙两人喝酒的杯数,其间以一个空格分隔。

输入样例:

5
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15

输出样例:

1 2

代码: 

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <cmath>
using namespace std;
int main()
{
    int n,jia=0,yi=0,i,j;
    cin>>n;
    int jhan,jhua,yhan,yhua;
    for(i=0;i<n;i++)
    {
    	int jj,yy;
    	cin>>jhan>>jhua>>yhan>>yhua;
    	jj=jhan+jhua;yy=yhan+yhua;
    	if(jhua==jhan+yhan&&yhua!=jhan+yhan)
    	{
    		yi++; 
		}
		else if(yhua==jhan+yhan&&jhua!=jhan+yhan){
			jia++;
		}
	}
	cout<<jia<<" "<<yi;
    return 0;
}

 1047 编程团体赛

分数 20

作者 CHEN, Yue

单位 浙江大学

编程团体赛的规则为:每个参赛队由若干队员组成;所有队员独立比赛;参赛队的成绩为所有队员的成绩和;成绩最高的队获胜。

现给定所有队员的比赛成绩,请你编写程序找出冠军队。

输入格式:

输入第一行给出一个正整数 N(≤104),即所有参赛队员总数。随后 N 行,每行给出一位队员的成绩,格式为:队伍编号-队员编号 成绩,其中队伍编号为 1 到 1000 的正整数,队员编号为 1 到 10 的正整数,成绩为 0 到 100 的整数。

输出格式:

在一行中输出冠军队的编号和总成绩,其间以一个空格分隔。注意:题目保证冠军队是唯一的。

输入样例:

6
3-10 99
11-5 87
102-1 0
102-3 100
11-9 89
3-2 61

输出样例:

11 176

代码: 

#include <iostream>
#include <string>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
using namespace std;
struct st 
{
	int dw,id,sc;	
};
int main()
{
	int n,i,j,a[10000]={0};
	cin>>n;
	st s[n+2];
	for(i=0;i<n;i++)
	{
		scanf("%d-%d %d",&s[i].dw ,&s[i].id ,&s[i].sc );
		a[s[i].dw ]+=s[i].sc ;
	}
	int max=0,t;
	for(i=0;i<1001;i++)
	{
		if(a[i]>max)
		{
			max=a[i];t=i;
		}
	}
	cout<<t<<" "<<max;
	return 0;
}

1048 数字加密

分数 20

作者 CHEN, Yue

单位 浙江大学

本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12;对偶数位,用 B 的数字减去 A 的数字,若结果为负数,则再加 10。这里令个位为第 1 位。

输入格式:

输入在一行中依次给出 A 和 B,均为不超过 100 位的正整数,其间以空格分隔。

输出格式:

在一行中输出加密后的结果。

输入样例:

1234567 368782971

输出样例:

3695Q8118

代码: 

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
	string p, q;
	int a[200];
	cin >> p>> q;
	reverse(p.begin(), p.end());
	reverse(q.begin(), q.end());
	if (p.size() > q.size())
		q.append(p.size() - q.size(), '0');
	else if(p.size() < q.size())
		p.append(q.size() - p.size(), '0');
	int A, B;
	for (int i = 0; i < p.length(); i++)
	{
		A = p[i] - '0';
		B = q[i] - '0';
		if (i % 2 == 0)
		{
			a[i] = (A + B) % 13;
		}
		else
		{
			a[i] = (B - A + 10) % 10;
		}
	}
	for (int i = p.length() - 1; i >= 0; i--)
	{
		if (a[i] == 10)
			cout << "J";
		else if (a[i] == 11)
			cout << "Q";
		else if (a[i] == 12)
			cout << "K";
		else
			cout << a[i];
	}
}

1049 数列的片段和

分数 20

作者 CAO, Peng

单位 Google

给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段。例如,给定数列 { 0.1, 0.2, 0.3, 0.4 },我们有 (0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1, 0.2, 0.3, 0.4) (0.2) (0.2, 0.3) (0.2, 0.3, 0.4) (0.3) (0.3, 0.4) (0.4) 这 10 个片段。

给定正整数数列,求出全部片段包含的所有的数之和。如本例中 10 个片段总和是 0.1 + 0.3 + 0.6 + 1.0 + 0.2 + 0.5 + 0.9 + 0.3 + 0.7 + 0.4 = 5.0。

输入格式:

输入第一行给出一个不超过 105 的正整数 N,表示数列中数的个数,第二行给出 N 个不超过 1.0 的正数,是数列中的数,其间以一个空格分隔。

输出格式:

在一行中输出该序列所有片段包含的数之和,精确到小数点后 2 位。

输入样例:

4
0.1 0.2 0.3 0.4

输出样例:

5.00

感谢 Ruihan Zheng 对测试数据的修正。

代码: 

#include <iostream>
#include <string>
#include <cstring>
#include <vector> 
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
	long long int n,i,j;
	vector<double>v;
	long double sum=0,a;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		cin>>a;
		v.push_back(a);
		sum+=a*(n-i+1)*i;
	}
	
	printf("%.2llf",sum);
	return 0;
}

 1050 螺旋矩阵

分数 25

作者 CHEN, Yue

单位 浙江大学

本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N;m≥n;且 m−n 取所有可能值中的最小值。

输入格式:

输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数。所有数字不超过 104,相邻数字以空格分隔。

输出格式:

输出螺旋矩阵。每行 n 个数字,共 m 行。相邻数字以 1 个空格分隔,行末不得有多余空格。

输入样例:

12
37 76 20 98 76 42 53 95 60 81 58 93

输出样例:

98 95 93
42 37 81
53 20 76
58 60 76

代码: 

#include <iostream>
#include <string>
#include <cstring>
#include <vector> 
#include <algorithm>
#include <cmath>
using namespace std;

int main()
{
	int N,i,j;
	cin>>N;
	int m,n,a[N+2];
	for(i=sqrt(N);i>=1;i--)
	{
		for(j=sqrt(N);j<=N+10;j++){
			if(i*j==N) {
				m=i;n=j;goto end;
			}
		}
	}end:{}
	int c[n+2][m+2],b[n+2][m+2];
	for(i=0;i<N;i++)
	{
		cin>>a[i];
	}
	sort(a,a+N,greater<int>());
	int k=0;
	for(int i=0;i<=n;i++){
			for(int j=0;j<=m;j++){
				c[i][j]=0;
			}
		}
	i=0;j=0;
	int x=0,y=0;
	while(k<N){
			while(y!=m &&c[x][y]==0){
				c[x][y]=1;
				b[x][y++]=a[k++];
			} y--;x++;
			while(x!=n &&c[x][y]==0){
				c[x][y]=1;
				b[x++][y]=a[k++];
			}x--;y--;
			while(y>=0 &&c[x][y]==0){
				c[x][y]=1;
				b[x][y--]=a[k++];
			}y++;x--;
			while(x>=0 &&c[x][y]==0){
				c[x][y]=1;
				b[x--][y]=a[k++];
			}x++;y++;
		}
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
		{
			cout<<b[i][j];
			if(j!=m-1) cout<<" ";
		}cout<<endl;
	}
	//cout<<m<<endl; cout<<n;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值