前后12天,乙组的所有题目算是刷完了,总体感觉不太难,偶尔有一两道题卡了一会也是审题不清、特殊数据,或者一些逃不掉的坑,但收获依然不少,明白了“永远要用最大的恶意去揣测出题人”,也改掉不少坏习惯,甲组的题目寒假才有时间继续做了。2020.3月,PAT 干。
1001 害死人不偿命的(3n+1)猜想
#include <iostream>
using namespace std;
int main() {
int n, cnt = 0;
cin >> n;
while (n != 1) {
if (n & 1) n = 3 * n + 1;
n = n / 2;
cnt++;
}
printf("%d", cnt);
return 0;
}
1002 写出这个数
#include <iostream>
#include <cstdio>
using namespace std;
string map[10] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
int main() {
#ifdef LOCAL
fstream cin("data.in");
#endif // LOCAL
int res = 0;
char c;
while (cin >> c) {
res += c - '0';
}
stack<int>s;
while (res) {
s.push(res % 10);
res /= 10;
}
while (!s.empty()) {
cout << map[s.top()];
s.pop();
if (!s.empty())
cout << " ";
}
return 0;
}
1003 我要通过!
#include <iostream>
#include <map>
using namespace std;
int main() {
int n, p = 0, t = 0;
string s;
cin >> n;
for(int i = 0; i < n; i++) {
cin >> s;
map<char, int> m;
for(int j = 0; j < s.size(); j++) {
m[s[j]]++;
if (s[j] == 'P') p = j;
if (s[j] == 'T') t = j;
}
if (m['P'] == 1 && m['A'] != 0 && m['T'] == 1 && m.size() == 3 && t-p != 1 && p * (t-p-1) == s.length()-t-1)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
1004 成绩排名
#include <iostream>
#include <algorithm>
using namespace std;
struct SS {
string name, id;
int grade;
bool operator<(SS a) {
return grade > a.grade;
}
}stu[105];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> stu[i].name >> stu[i].id >> stu[i].grade;
}
sort(stu, stu + n);
cout << stu[0].name << ' ' << stu[0].id << endl;
cout << stu[n - 1].name << ' ' << stu[n - 1].id << endl;
return 0;
}
1005 继续(3n+1)猜想
#include <iostream>
using namespace std;
int pre[10005];
int FIND(int x) {
return x == pre[x] ? pre[x] : pre[x] = FIND(pre[x]);
}
void fun(int n) {
if (n == 1)return ;
if (n & 1) {
pre[(3 * n + 1) / 2] = n;
fun((3 * n + 1) / 2);
}
else {
pre[n / 2] = n;
fun(n / 2);
}
}
int main() {
int k;
cin >> k;
while (k--) {
int n;
cin >> n;
if (!pre[n])
pre[n] = n;
fun(n);
}
int cnt = 0;
for (int i = 100; i >= 1; i--) {
if (pre[i] == i) {
cnt++;
}
}
for (int i = 100; i >= 1; i--) {
if (pre[i] == i) {
cout << i;
cnt--;
if (cnt != 0)cout << ' ';
}
}
return 0;
}
1006 换个格式输出整数
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
string s;
cin >> s;
if (s.size() == 3) {
int len = s[0] - '0';
for (int i = 0; i < len; i++) {
putchar('B');
}
}
if (s.size() >= 2) {
int len = s[s.size() - 2] - '0';
for (int i = 0; i < len; i++) {
putchar('S');
}
}
if (s.size() >= 1) {
int len = s[s.size() - 1] - '0';
for (int i = 1; i <= len; i++) {
putchar(i + '0');
}
}
return 0;
}
1007 素数对猜想
#include <iostream>
#include <cstdio>
using namespace std;
bool M[100005];
int prime[50005];
int total;
void Eulersieve(int n) {
for (int i = 2; i <= n; i++) {
if (!M[i]) prime[total++] = i;
for (int j = 0; j < total && i * prime[j] <= n; j++) {
M[i * prime[j]] = true;
if (i % prime[j] == 0)break;
}
}
}
int main() {
int n, res = 0;
cin >> n;
Eulersieve(n);
for (int i = 1; i < total; i++) {
if (prime[i] - prime[i - 1] == 2) {
res++;
}
}
printf("%d\n", res);
return 0;
}
1008 数组元素循环右移问题
#include <iostream>
#include <cstdio>
using namespace std;
int arr[105];
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
int k = (n - m) % n;
while (k < 0) {
k += n;
}
printf("%d", arr[k]);
k = (k + 1) % n;
for (int i = 0; i < n - 1; i++) {
printf(" %d", arr[k]);
k = (k + 1) % n;
}
return 0;
}
1009 说反话
#include <iostream>
#include <string>
#include <stack>
#include <cstdio>
using namespace std;
int main() {
string s;
stack<string >q;
while (cin >> s) {
q.push(s);
if (getchar() == '\n')break;
}
while (!q.empty()) {
cout << q.top();
q.pop();
if (!q.empty())cout << ' ';
}
return 0;
}
1010 一元多项式求导
#include<iostream>
using namespace std;
int main(){
int coef;
int expo;
cin >> coef >> expo;
if (expo == 0){
cout << "0 0";
return 0;
}
else
cout << coef * expo << ' ' << expo - 1;
while (cin >> coef >> expo)
if (expo != 0)
cout << ' ' << coef * expo << ' ' << expo - 1;
return 0;
}
1011 A+B 和 C
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int T;
cin >> T;
for (int i = 1; i <= T; i++) {
long long a, b, c;
cin >> a >> b >> c;
bool res = (a + b > c);
cout <<boolalpha<< "Case #" << i << ": " << res << endl;
}
return 0;
}
1012 数字分类
#include <iostream>
#include <cstdio>
using namespace std;
int arr[1005];
int a[6];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
int flag = 1, cnt = 0;
bool a2_flag = false;
for (int i = 0; i < n; i++) {
if (arr[i] % 5 == 0 && !(arr[i] & 1)) {
a[1] += arr[i];
}
else if (arr[i] % 5 == 1) {
a[2] += flag * arr[i];
flag = ~flag + 1;
a2_flag = true;
}
else if (arr[i] % 5 == 2) {
a[3]++;
}
else if (arr[i] % 5 == 3) {
a[4] += arr[i];
cnt++;
}
else if (arr[i] % 5 == 4) { //错误点,最后直接写了else
if (arr[i] > a[5])a[5] = arr[i];
}
}
if (a[1]) {
printf("%d", a[1]);
}
else
printf("N");
for (int i = 2; i <= 5; i++) {
if ((i != 2 && !a[i]) || (i == 2 && !a2_flag)) {
printf(" N");
}
else {
if (i == 4) {
printf(" %.1lf", (double)a[i] / cnt);
}
else printf(" %d", a[i]);
}
}
return 0;
}
1013 数素数
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 200005;
bool M[N];
int prime[10005];
int total;
void EulerSieve() {
for (int i = 2; i < N && total < 10005; i++) {
if (!M[i]) {
prime[total++] = i;
}
for (int j = 0; j < total && i * prime[j] < N; j++) {
M[i * prime[j]] = true;
if (i % prime[j] == 0)break;
}
}
}
int main() {
EulerSieve();
int m, n;
cin >> m >> n;
m--; n--;
int k = 0;
for (int i = m; i <= n; i++) {
printf("%d", prime[i]);
k++;
if (k % 10 == 0) {
printf("\n");
continue;
}
if (i != n)printf(" ");
}
return 0;
}
1014 福尔摩斯的约会
#include <iostream>
#include <map>
#include <string>
#include <cstdio>
using namespace std;
string DAY[8] = { "","MON","TUE","WED","THU","FRI","SAT","SUN" };
int alphabet_judge(char c) {
if (c >= 'a' && c <= 'z')return 1;
if (c >= 'A' && c <= 'Z')return 2;
return 0;
}
bool check1(char c) {
if (c >= 'A' && c <= 'G')return true;
return false;
}
bool check2(char c) {
if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'N'))return true;
return false;
}
int main() {
string s1, s2, s3, s4;
cin >> s1 >> s2 >> s3 >> s4;
string day;
int hours, minute;
int len = s1.length() < s2.length() ? s1.length() : s2.length();
int i;
for (i = 0; i < len; i++) {
if (check1(s1[i]) && s1[i] == s2[i]) {
day = DAY[s1[i] - 'A' + 1];
i++;
break;
}
}
for (; i < len; i++) {
if (check2(s1[i]) && s1[i] == s2[i]) {
hours = (s1[i] >= '0' && s1[i] <= '9') ? s1[i] - '0' : 10 +s1[i] - 'A';
break;
}
}
len = s3.length() < s4.length() ? s3.length() : s4.length();
for (i = 0; i < len; i++) {
if (alphabet_judge(s3[i]) && s3[i] == s4[i]) {
minute = i;
break;
}
}
cout << day << ' ';
printf("%02d:%02d", hours, minute);
return 0;
}
1015 德才论
#include <iostream>
#include <queue>
#include <cstdio>
using namespace std;
struct stu {
int id, moral, talent;
bool operator<(stu s)const {
if (moral + talent == s.moral + s.talent) {
if (moral == s.moral) {
return id > s.id;
}
return moral < s.moral;
}
return moral + talent < s.moral + s.talent;
}
};
priority_queue<stu>q1, q2, q3, q4;
inline void print(priority_queue<stu>q) {
while (!q.empty()) {
stu s = q.top();
q.pop();
printf("%d %d %d\n", s.id, s.moral, s.talent);
}
}
int main() {
int n, least, standard;
cin >> n >> least >> standard;
for (int i = 0; i < n; i++) {
stu s;
scanf("%d%d%d", &s.id, &s.moral, &s.talent);
if (s.moral >= least && s.talent >= least) {
if (s.moral >= standard && s.talent >= standard) {
q1.push(s);
}
else if (s.moral >= standard && s.talent < standard) {
q2.push(s);
}
else if (s.moral < standard && s.talent < standard && s.moral >= s.talent) {
q3.push(s);
}
else {
q4.push(s);
}
}
}
printf("%d\n", q1.size() + q2.size() + q3.size() + q4.size());
print(q1);
print(q2);
print(q3);
print(q4);
return 0;
}
1016 部分A+B
#include <iostream>
using namespace std;
long long getP(int a,int da) {
long long pa = 0;
while (a) {
if (a % 10 == da) {
pa += da;
pa *= 10;
}
a /= 10;
}
pa /= 10;
return pa;
}
int main() {
int a, da, b, db;
scanf("%d%d%d%d", &a, &da, &b, &db);
printf("%lld", getP(a, da) + getP(b, db));
return 0;
}
1017 A除以B
#include <string>
#include <vector>
#include <iostream>
using namespace std;
vector<int>res;
string a;
int x, b;
int main() {
cin >> a >> b;
int i = 0, temp;
while ((temp = ((x << 3) + (x << 1) + (a[i] ^ 48))) / b == 0) {
x = temp;
i++;
}
for (; i < a.size(); i++) {
x = (x << 3) + (x << 1) + (a[i] ^ 48);//x累计数字来进行除法计
res.push_back(x / b);//存放结果
x %= b;//除完后的余数
}
if (res.empty())
res.push_back(0);
for (i = 0; i < res.size(); i++) {
cout << res[i];//输出
}
cout << ' ';
cout << x << endl;
return 0;
}
1018 锤子剪刀布
#include <cstdio>
#include <algorithm>
#include <map>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int A, B, C;//甲胜、乙胜、平局
int M_A[3], M_B[3];
int judge(char a,char b) {
switch (a) {
case 'C':
if (b == 'C') return 0;
if (b == 'B') return 1;
return -1;
case 'B':
if (b == 'B')return 0;
if (b == 'J')return 1;
return -1;
case 'J':
if (b == 'J')return 0;
if (b == 'C')return 1;
return -1;
}
}
int getIndex(char c) {
if (c == 'B')return 0;
if (c == 'C')return 1;
return 2;
}
char getLetter(int i) {
if (i == 0)return 'B';
if (i == 1)return 'C';
return 'J';
}
int main() {
int n;
cin >> n;
cin.ignore();
for (int i = 0; i < n; i++) {
char a, b;
a = getchar(); getchar();
b = getchar(); getchar();
int temp = judge(a, b);
if (temp == -1) {
A++;
M_A[getIndex(a)]++;
}
else if (temp == 1) {
B++;
M_B[getIndex(b)]++;
}
else C++;
}
printf("%d %d %d\n", A, C, n - A - C);
printf("%d %d %d\n", B, C, n - B - C);
int index_a = 0, index_b = 0;
for (int i = 1; i < 3; i++) {
if (M_A[i] > M_A[index_a]) {
index_a = i;
}
if (M_B[i] > M_B[index_b]) {
index_b = i;
}
}
printf("%c %c", getLetter(index_a), getLetter(index_b));
return 0;
}
1019 数字黑洞
#include <cstdio>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int getMin(int x) {
int flag[10] = { 0 };
for (int i = 0; i < 4; i++) {
flag[x % 10] ++;
x /= 10;
}
int res = 0;
for (int i = 0; i < 10; i++) {
while (flag[i]) {
flag[i]--;
res = res * 10 + i;
}
}
return res;
}
int getMax(int x) {
int flag[10] = { 0 };
for (int i = 0; i < 4; i++) {
flag[x % 10] ++;
x /= 10;
}
int res = 0;
for (int i = 9; i >= 0; i--) {
while (flag[i]) {
flag[i]--;
res = res * 10 + i;
}
}
return res;
}
int main() {
int n;
cin >> n;
int flag[10] = { 0 };
int temp = n;
while (temp) {
flag[temp % 10]++;
if (flag[temp % 10] == 4) {
printf("%04d - %04d = 0000\n", n, n);
return 0;
}
temp /= 10;
}
int L, R;
do {
L = getMax(n), R = getMin(n);
n = L - R;
printf("%04d - %04d = %04d\n", L, R, n);
} while (L - R != 6174);
return 0;
}
1020 月饼
#include <iostream>
#include <map>
#include <cstdlib>
#include <ctime>
#include <algorithm>
using namespace std;
struct node {
double value, weight;
bool operator<(node a) {
return value / weight > a.value / a.weight;
}
}N[1005];
int main(){
int n;
double V, res = 0;
cin >> n >> V;
for (int i = 0; i < n; i++) {
scanf("%lf", &N[i].weight);
}
for (int i = 0; i < n; i++) {
scanf("%lf", &N[i].value);
}
sort(N, N + n);
int i;
for (i = 0; i < n && V - N[i].weight >= 0; i++) {
res += N[i].value;
V -= N[i].weight;
}
if (i != n && V > 0) {
res += N[i].value * (V / N[i].weight);
}
printf("%.2lf", res);
return 0;
}
1021 个位数统计
#include <iostream>
using namespace std;
int res[10];
int main() {
char c;
while ((c = getchar()) != '\n') {
res[c - '0']++;
}
for (int i = 0; i < 10; i++) {
if (res[i] != 0)
printf("%d:%d\n", i, res[i]);
}
return 0;
}
1022 D进制的A+B
#include <iostream>
#include <cstdio>
using namespace std;
int res[35];
int main() {
int a, b, n, D;
scanf("%d%d%d", &a, &b, &D);
n = a + b;
if (n == 0) {
printf("0");
}
else {
int i = 0;
while (n) {
res[i++] = n % D;
n /= D;
}
i--;
for (; i >= 0; i--) {
printf("%d", res[i]);
}
}
printf("\n");
return 0;
}
1023 组个最小数
#include <iostream>
using namespace std;
int cnt[10];
int main() {
int k;
for (int i = 0; i < 10; i++) {
scanf("%d", &k);
cnt[i] = k;
}
for (int i = 1; i < 10; i++) {
if (cnt[i]) {
putchar(i + '0');
cnt[i]--;
break;
}
}
for (int i = 0; i < 10; i++) {
while (cnt[i]) {
putchar(i + '0');
cnt[i]--;
}
}
return 0;
}
1024 科学计数法
#include <cstdio>
#include <algorithm>
#include <map>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int e;//指数
string fraction;//定点部分
int main() {
string s;
cin >> s;
char sign1 = s[0];
int i = 1;
for (i = 1; s[i] != 'E'; i++) {
if (s[i] != '.') {
fraction.append(1, s[i]);
}
}
char sign2 = s[++i];
i++;
for (; i < s.length(); i++) {
e = (e << 3) + (e << 1) + (s[i] ^ 48);
}
if (sign1 == '-')
putchar(sign1);
if (e == 0) {
putchar(fraction[0]);
putchar('.');
cout << fraction.substr(1);
return 0;
}
if (sign2 == '-') {
putchar('0');putchar('.');
for (int i = 0; i < e - 1; i++) {
putchar('0');
}
cout << fraction << endl;
}
else {
if (e >= fraction.length() - 1) {
cout << fraction;
for (int i = 0; i < e - fraction.le