一般路人向第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;
}

posted on 2025-09-27 18:32  汐寻  阅读(29)  评论(0)    收藏  举报