一般路人向第39次CSP认证(220/500)
本人本科的第一次 CSP 认证。考完这次明年保研前还有三次机会。
准备约等于零,结果是分数大于 200,可以不写寒暑假作业了。
前一天晚上有事儿导致起得很晚。早起考了场试回来睡回笼觉,十二点起来才开始整理开卷用的各种 pdf 资料。开考前 20 min 打印店盛况:全是排队打准考证打模板的。
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';
else
aa[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;
}
浙公网安备 33010602011771号