题目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;
}