【PTA刷题】乙级 1046 To 1065

博主分享了在PTA平台刷乙级1046到1065题目的经历,涉及数组操作、字符串处理、复数乘法、螺旋矩阵等算法问题。遇到的难点包括数字加密、数列片段和、住房空置率等,分享了解题技巧和常见陷阱,如数组边界、格式输入输出、特殊数值处理等。
摘要由CSDN通过智能技术生成

B1046.划拳 7Min
签到题

/*B1046*/
#include <iostream>

using namespace std;

int main()
{
   
	int N;
	cin >> N;
	int Awin = 0, Bwin = 0;
	for (int i = 0; i < N; i++)
	{
   
		int AGuess, A, BGuess, B;
		cin >> AGuess >> A >> BGuess >> B;
		int sum = AGuess + BGuess;
		if (A == sum && B != sum) Awin++;
		if (B == sum && A != sum) Bwin++;
	}

	cout << Bwin << " " << Awin;

	return 0;
}

B1047.编程团体赛 9min
签到题

/*B1047*/
#include <iostream>
#include <vector>
#include <string>
#include <cctype>
#include <algorithm>
#include <stdio.h>

using namespace std;

int main()
{
   
	int N;
	cin >> N;
	int TeamScore[1001] = {
   0};

	for (int i = 0; i < N; i++)
	{
   
		int Tid, Pid, score;
		scanf("%d-%d %d", &Tid, &Pid,&score);

		TeamScore[Tid] += score;
	}
	int maxS = 0, maxID;
	for (int i = 1; i < 1001; i++)
	{
   
		if (TeamScore[i] > maxS)
		{
   
			maxS = TeamScore[i];
			maxID = i;
		}
	}
	printf("%d %d", maxID, maxS);


	return 0;
}

B1048.数字加密 51min
自己做了非常久,主要是被不知道A长还是B长卡住了。柳神使用了补位的方法非常好,我觉得比判断size是否大于0要好理解而且不容易出错。
出现了几个用法:
1.reverse(A.begin(),B.end()); 翻转数组
2.str.append(你要补多少个,‘你要补啥字符’);用于str的末尾补全。
3.str[xxx] = {“asdansjdnsa”} 用于方便的转化int和char。非常机智
4.再次强调string的方便之处,可以直接 str += 某些字符或字符串。要学会用这个性质。

/*B1048*/
#include <iostream>
#include <vector>
#include <string>
#include <cctype>
#include <algorithm>
#include <stdio.h>

using namespace std;

int main()
{
   
	string A, B,c;
	cin >> A >> B;

	string tmp;
	int Asize = A.length(), Bsize = B.length();

	reverse(A.begin(), A.end());
	reverse(B.begin(), B.end());//翻转

	if (Asize > Bsize)
		B.append(Asize - Bsize, '0');
	else
		A.append(Bsize - Asize, '0');//短的那个string补0

	char str[14] = {
    "0123456789JQK" };
	for (int i = 0; i < B.size(); i++)
	{
   
		if (i % 2 == 0)
			c += str[((A[i] - '0') + (B[i] - '0')) % 13];
		else
		{
   
			if (B[i] - A[i] < 0)
				c += str[(B[i] - '0') - (A[i] - '0') + 10];
			else
				c += str[(B[i] - '0') - (A[i] - '0')];
		}
	}
	for (int i = c.length() - 1; i >= 0; i--)
		cout << c[i];


	return 0;
}

1049.数列的片段和 fail
没做出来。
解法:假设我们选取的片段包括某个数字n,然后该片段的头指针有i种选择,片段的尾指针有(N-1-i)种选择,这样这个指针组合就是 i * (N-1-i)种。但实际上不知道为啥后面变成了 n xi x(N-i+1)。

/*B1049*/
#include <iostream>
#include <vector>
#include <string>
#include <cctype>
#include <algorithm>
#include <stdio.h>

using namespace std;

int main()
{
   
	int N;
	cin >> N;
	
	double sum = 0.0, n;
	for (int i = 0; i < N; i++)
	{
   
		cin >> n;
		sum += n*i*(N - i + 1);
	}
	printf("%.2lf",sum);
	
	return 0;
}

B1050.螺旋矩阵 fail
第一次做: 打印没想出办法,只计算出了mn。
第二次做:高度参考了柳神的方法。 每个口字型做一个level,用i(当前level层数)以及j(每一笔必定只有一个变量,要么是行,要么是列,J就表示这个变化的东西),来表示出矩阵的每一个位置。

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string>
#include <map>
#include <vector>
#include <math.h>

using namespace std;

bool cmp(int a ,int b)
{
   
	return a > b ? true : false;
}

int main()
{
   
	int N,m,n;
	cin >> N;
	
	for (n = sqrt(N); n > 0; n--)
	{
   
		if (N % n == 0)
			break;
	}
	m = N / n;
	vector<int> ori(N);
	for (int i = 0; i < N; i++)
	{
   
		cin>>ori[i];
	}
	sort(ori.begin(), ori.end(), cmp);
	vector<vector<int> > b(m, vector<int>(n));//创建矩阵

	int level = m / 2 + m % 2;
	int t = 0;

	//填入原理:i是当前层数,j是变化的一笔,这一笔可以是行也可以是列。
	//i,j,m,n来表示矩阵的每一个位置。只要细心是不会出错的。
	for (int i = 0; i < level; i++)//外层循环控制层数
	{
   
		for (int j = i; j <= n - 1 - i && t <= N - 1; j++)
			b[i][j] = ori[t++];
		for (int j = i + 1; j <= m - 2 - i && t <= N - 1; j++)
			b[j][n -1-i] = ori[t++];
		for (int j = n - 1 - i; j >= i && t <= N - 1; j--)
			b[m - 1 - i][j] = ori[t++];
		for (int j = m - 2 - i; j >= i + 1 && t <= N; j--)
			b[j][i] = ori[t++];
	}
	for (int i = 0; i < m; i++)
	{
   
		for (int j = 0; j < n; j++)
		{
   	
			if(j != n-1)
				cout << b[i][j]<<" ";
			else
				cout << b[i][j] << "\n";
		}
	}

	return 0;
}

B1051.复数乘法 12min
有两个点没过,看题解是说A和B如果大于-0.005但小于0时,会出错。本来应该输出0.00,但输出了-0.00.等于说要排除这个特殊情况。但自己做的时候没发现。(我也不知道咋发现)
记得cos,sin在math.h里面。

/*B1051*/
#include <iostream>
#include <vector>
#include <string>
#include <cctype>
#include <algorithm>
#include <stdio.h>
#include &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值