PTA练习02

题目1:

PAT (Basic Level) Practice (中文)1010 一元多项式求解

题目详情:

思路:

1.之前有过类似的回车结束的题,可以使用getchar判断是否出现回车来结束。

2.此外还要注意最后无空格和指数为0跳过的问题。

详细代码:

#include<iostream>
using namespace std;

int xi[100];//系数
int zhi[100];//指数

int main()
{
	int i = 0;
	while (true)
	{
		cin >> xi[i] >> zhi[i];
		char c = getchar();
		if (zhi!=0)
		{
			zhi[i] = zhi[i]-1;
			xi[i] *= zhi[i]+1;
		}
		else
			xi[i] = 0;
		if (c == '\n')
			break;
		i++;
	}
	int j = i;
	i = 0;
	while (true)
	{
		if (xi[i]==0&&zhi[i]!=0)
			i++;
		if (xi[i] == 0 && zhi[i] == 0)
			cout << xi[i] << " " << zhi[i];
		if (xi[i]!=0)
		{
			cout << xi[i] << " " << zhi[i];
			i++;
		}
		if (i==j+1)
			break;
		cout << " ";
	}
	return 0;
}

题目2:

PAT (Basic Level) Practice (中文)1011 A+B和C

题目详情:

思路:

1.本题不难,主要注意输入输出的格式要求。需要注意输入数的区间要求和严格输出指定格式。

2.具体细节见代码注释。

详细代码:

#include<iostream>
using namespace std;
int main()
{
	int n;//组数n
	int t = 1;//满足输出格式要求
	cin >> n;
	while (n--)//循环n次结束
	{
		long a, b, c;//输入的数区间较大,用long类型
		cin >> a >> b >> c;
		if (a + b > c)//比较
			cout << "Case #" << t++ << ": " << "true" << endl;
		else
			cout << "Case #" << t++ << ": " << "false" << endl;
	}
	return 0;
}

题目3:

PAT (Basic Level) Practice (中文)1012 数字分类

题目详情:

思路:

1.本题主要是通过不同的小算法分类。

2.通过标记可以判断要不要输出N。

3.具体细节见代码注释。

详细代码:

#include<iostream>
#include<stdio.h>
using namespace std;
int num[1000];

int main()
{
	int n;
	int a1 = 0, a2 = 0, a3 = 0, a4geshu = 0, a5 = -1;//5类数
	double a4 = 0.0;
	int tmp = 1;//用于交错相加
	int f1 = 0, f2 = 0, f3 = 0, f4 = 0, f5 = 0;//标记

	scanf("%d", &n);
	for (int i = 0; i < n; i++)//循环n次
	{
		scanf("%d", &num[i]);
		if (num[i] % 10 == 0)//能被5整数的偶数
		{
			a1 += num[i];//累加
			f1 = 1;//标记为1
		}
		if (num[i] % 5 == 1)//余1,以下类似
		{
			a2 += (num[i] * tmp);
			tmp *= -1;//tmp编号来交错相加
			f2 = 1;
		}
		if (num[i] % 5 == 2)
		{
			a3++;
			f3 = 1;
		}
		if (num[i] % 5 == 3)
		{
			a4 += num[i];
			a4geshu++;
			f4 = 1;
		}
		if (num[i] % 5 == 4)
		{
			a5 = max(a5, num[i]);//max判断最大值  
			f5 = 1;
		}
	}
	a4 /= a4geshu;//求平均数
	//利用标记判断
	if (f1 == 0)
		printf("N ");
	else
		printf("%d ", a1);
	if (f2 == 0)
		printf("N ");
	else
		printf("%d ", a2);
	if (f3 == 0)
		printf("N ");
	else
		printf("%d ", a3);
	if (f4 == 0)
		printf("N ");
	else
		printf("%.1lf ", a4);//保留1位小数
	if (f5 == 0)
		printf("N\n");
	else
		printf("%d\n", a5);
	return 0;
}

题目4:

PAT (Advanced Level) Practice 1006 Sign In and Sign Out

题目详情:

思路:

1.本题的大体意思是,每天员工按题目要求格式打卡,写程序来找到第一个人和最后一个人,分别打印他们的编号。

2.利用布尔函数和strcmp比较字符串来满足题目要求。

详细代码:

#include<iostream>
using namespace std;
char in_id[20], out_id[20], in_time[20], out_time[20];//出入id和时间

bool check(char a[], char b[], char name[]) 
{
	if (strcmp(a, b) < 0)//利用strcmp比较字符串,若<0,则a<b
	{
			if (strcmp(in_time, a) > 0) {
				strncpy(in_time, a, sizeof(out_time));
				strncpy(in_id, name, sizeof(in_id));
			}
			if (strcmp(out_time, b) < 0) {
				strncpy(out_time, b, sizeof(out_time));
				strncpy(out_id, name, sizeof(out_id));
			}
	}
	return false;
}

int main() {
	char id[20], in_time[15], out_time[15];
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> id >> in_time >> out_time;
		check(in_time, out_time, id);
	}
	cout << in_id << " " << out_id;
	return 0;
}

题目5:

PAT (Advanced Level) Practice 1007 Maximum Subsequence Sum

题目详情:

思路:

1.本题大体意思是求最大子序列之和,输出最大的和和首尾元素。特别的,如果所有数都小于0,那么最大和位0。

2.先在读入时就累加,如果为负,则直接赋为0,子序列从下一个开始,此时最大值就求出来了,用一个新变量存储这个值。

题目6:

PAT (Top Level) Practice 1002 Business

题目详情:

思路:

1.本题的大体意思是通过输入的项目的所需时间、截止时间和利润来求最大利润。

2.本题为动态规划问题且需要先进行排序。

详细代码:

#include<iostream>
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;

#define inf 1000000000
struct node {
	int a, b, m;
};
int main() {
	int n, max1 = 0, max2 = 0;
	scanf("%d", &n);
	vector<node> v(n + 1);
	for (int i = 1; i <= n; i++)
	{
		scanf("%d %d %d", &v[i].a, &v[i].b, &v[i].m);
		if (v[i].m > max1)
			max1 = v[i].m;
	}
	sort(v.begin() + 1, v.end());
	vector<int> dp(max1 + 1, 0);
	for (int i = 1; i <= n; i++){
		for (int j = v[i].m; j - v[i].b >= 0; j--){
			dp[j] = max(dp[j], dp[j - v[i].m] + v[i].a);
		}
	}
	for (int i = 1; i <= max1; i++){
		if (dp[i] > max2)
			max2 = dp[i];
	}
	printf("%d\n", max2);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值