一般路人向第39次CSP认证
Q1
第一题十分水,照着他意思来就行了,十来分钟写出来交上去,不行。反复确认直到半个小时,发现交到第二题上去了。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int m, n;
double a, pi;
double x[1001], y[1001];
int main()
{m = 0;scanf("%d %lf", &n, &a);for (int i = 1; i <= n; i++){scanf("%lf %lf", &x[i], &y[i]);if (x[i] * x[i] + y[i] * y[i] <= a * a){m++;}}pi = 4.0 * m / n;printf("%.6f", pi);return 0;
}
Q2
字符串模拟。不会算法就是 80 分。
// 注意:此程序只能通过 80% 的测试点。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>int strfind(char str[], char key[], int m)
{int l1, l2, i, j, flag;l1 = strlen(str);l2 = strlen(key);for (i = m; i <= l1 - l2; i++){flag = 1;for (j = 0; j < l2; j++){if (str[i + j] != key[j]){flag = 0;break;}}if (flag)return i;}return -1;
}int mid(char str[], int start, int len, char strback[])
{int l, i, k = 0;l = strlen(str);if (start + len > l)return 0;for (i = start; i < start + len; i++)strback[k++] = str[i];strback[k] = '\0';return 1;
}char key1[10] = "000000000";
char key2[10] = "011011010";
char key3[10] = "011000001";
char key4[10] = "011110011";
char key5[10] = "000000011";
char keyy2[10];
char keyy3[10];
char keyy4[10];
char keyy5[10];
int n, l, k;
int flag;
int a[201][201];
char aa[202][202];
int main()
{scanf("%d %d", &n, &l);for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){scanf("%d", &a[i][j]);}}for (k = 1; k <= l - 1; k++){flag = 0;for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){if (a[i][j] >= k)aa[i][j] = '0';elseaa[i][j] = '1';}aa[i][n + 1] = '\0';}int c;for (int i = 0; i < n; i++){c = 0;while (1){c = strfind(aa[i], key1, c);if (c == -1)break;if (c != -1){mid(aa[i + 1], c, 9, keyy2);mid(aa[i + 2], c, 9, keyy3);mid(aa[i + 3], c, 9, keyy4);mid(aa[i + 4], c, 9, keyy5);int d = strcmp(keyy2, key2);if (strcmp(keyy2, key2) == 0 && strcmp(keyy3, key3) == 0 && strcmp(keyy4, key4) == 0 && strcmp(keyy5, key5) == 0){printf("%d\n", k);flag = 1;break;}}c = c + 1;}if (flag == 1)break;}if (flag == 1)continue;}return 0;
}
Q3
题干超长的字符串大模拟,篇幅整整十来页,阅读理解花了不少时间,不过结合后边给出的输出示例分析慢慢实现也比较快。需要结合给出的示例程序实现哈夫曼树解密的操作,梳理逻辑半天没整出来。回头看一眼测试点,发现前 40% 的点居然根本用不到哈夫曼解密,遂先实现了其他功能,匆匆交卷结束。
// 注意:此程序只能通过 40% 的测试点。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>int s, d, n;
char sname[184][151];
char svalue[184][151];
char haffkey[200];
void hufback(char op[], int k)
{int i;int count = 0;char realback[800]="";for (i = 0; op[i] != '\0'; i++){if (op[i] == '0') strcat(realback, "0000");if (op[i] == '1') strcat(realback, "0001");if (op[i] == '2') strcat(realback, "0010");if (op[i] == '3') strcat(realback, "0011");if (op[i] == '4') strcat(realback, "0100");if (op[i] == '5') strcat(realback, "0101");if (op[i] == '6') strcat(realback, "0110");if (op[i] == '7') strcat(realback, "0111");if (op[i] == '8') strcat(realback, "1000");if (op[i] == '9') strcat(realback, "1001");if (op[i] == 'a') strcat(realback, "1010");if (op[i] == 'b') strcat(realback, "1011");if (op[i] == 'c') strcat(realback, "1100");if (op[i] == 'd') strcat(realback, "1101");if (op[i] == 'e') strcat(realback, "1110");if (op[i] == 'f') strcat(realback, "1111");count++;}for (int i = 0; i < k - 1; i++){realback[4 * count - i] = 0;}realback[4 * count - k + 1] = '\0';//huf(realback);
}
void opstep(char op[], char opback[])
{if (op[0] != 'H'){strcpy(opback, op);}else{if (op[1] == 'H') {for (int i = 1; op[i - 1] != '\0'; i++){opback[i - 1] = op[i];}}else //huffman{/*int i;int k;for (i = 1; op[i + 2] != '\0'; i++){opback[i - 1] = op[i];}opback[i] = '\0';k = op[i + 1] - '0';hufback(opback, k);*/}}
}int main()
{scanf("%d %d", &s, &d);for (int i = 0; i < s; i++){scanf("%s %s", &sname[i], &svalue[i]);}scanf("%s", &haffkey);scanf("%d", &n);int op, op1, op2, op3;char op21[200], op22[200], op31[200], op32[200];char op1back[800], op2back[800];for (int i = 0; i < n; i++){scanf("%d", &op);if (op == 1){scanf("%d", &op1);printf("%s: %s\n", sname[op1-1], svalue[op1-1]);}else if (op == 2){scanf("%d", &op2);if (op2 == 0){scanf("%s %s", &op21, &op22);opstep(op21, op1back);opstep(op22, op2back);printf("%s %s\n", op1back, op2back);}else{scanf("%s", &op21);opstep(op21, op1back);printf("%s: %s\n", sname[op2 - 1], op1back);}}else if (op == 3){scanf("%d", &op3);if (op3 == 0){scanf("%s %s", &op31, &op32);opstep(op31, op1back);opstep(op32, op2back);printf("%s: %s\n", op1back, op2back);}else{scanf("%s", &op31);opstep(op31, op1back);printf("%s: %s\n", sname[op3-1], op1back);}}}return 0;
}
Q5
没时间了,扫了一眼然后乱猜,草草交卷,果然没过。
# 注意:以下是一个错误的程序,不能通过本题目的任何测试点。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int m, n;
int a[3001], b[3001];
void step(int a[], int b[], int pri[])
{int d, e;d = a[1]; e = 1;for (int i = 2; i <= n; i++){if (a[i] < a[i - 1]){d = a[i];e = i;}}int d2, e2;d2 = b[e]; e2 = e;for (int i = e; i <= n; i++){if (b[i] < b[i - 1]){d2 = b[i];e2 = i;}}pri[0] += d;pri[0] += d2;a[e] = 1000000009;b[e2] = 1000000009;
}
int main()
{int pri[1];int count = 0;pri[0] = 0;scanf("%d %d", &n, &m);for (int i = 1; i <= n; i++){scanf("%d", &a[i]);}for (int i = 1; i <= n; i++){scanf("%d", &b[i]);}while (pri[0] <= m){step(a, b, pri);count++;}printf("%d\n", count);return 0;
}
