CSP认证题解第一题

202012-1 期末预测之安全指数

#include <iostream>
using namespace std;

int Judge(int sum)
{
	if(sum > 0)
		return sum;
	else
		return 0;
}

int main()
{
	int n, score, w, sum;
	sum = 0;
	cin >> n;
	while(n--){
		cin >> score >> w;
		int t = score * w;
		sum += t;
	}
	//cout << sum << endl;
	/*
	if(sum > 0)
		cout << sum;
	else
		cout << "0";
	*/
	cout << Judge(sum) << endl;
	
	return 0;
}

202009-1 称检测点查询

70,第一次考试紧张吧,没写好,后来发现挺简单的,考试还是把人家规定的4个小时坐完再走啊。

#include <iostream>
#include <string>
#include <cstring>
#define N 200
using namespace std;

void bubblesort(int s[], int);
void bubblesort(int s[], int n)
{
	int i, j;
	for(i = n - 1; i > 0; i--)
		for(j = 1; j <= i; j++)
			if(s[j - 1] > s[j])
			{
				int temp = s[j - 1];
				s[j - 1] = s[j];
				s[j] = temp;
			}
}

int sub[N + 1], sub1[N + 1];

int main()
{
	int n, x0, y0, i, x, y, cnt = 0;
	
	scanf("%d%d%d", &n, &x0, &y0);
	for(i = 0; i < n; i++)
	{
		scanf("%d%d", &x, &y);
		sub[i] = (x - x0) * (x - x0) + (y - y0) * (y - y0);
	}
	
	for(i = 0; i < n; i++)
		sub1[i] = sub[i];
		
	bubblesort(sub, n);
	
	if(sub[0] == sub[1] && sub[0]== sub[2])
	{
		for(i = 0; i < n; i++)
			if(sub[0] == sub1[i])
				if(cnt != 3)
				{
					printf("%d\n", i + 1);
					cnt++;
				}
	}
	else if(sub[0] == sub[1])
	{
		for(i = 0; i < n; i++)
			if(sub[0] == sub1[i])
			{
				printf("%d\n", i+1);
				cnt++;
			}
		for(i = 0; i < n; i++)
			if(sub[2] == sub1[i])
				if(cnt != 3)
				{
					printf("%d\n", i+1);
					cnt++;
				}
	}
	else
	{
		for(i = 0; i < n; i++)
			if(sub[0] == sub1[i])
				printf("%d\n", i+1);
		for(i = 0; i < n; i++)
			if(sub[1] == sub1[i])
				printf("%d\n", i+1);
		for(i = 0; i < n; i++)
			if(sub[2] == sub1[i])
				printf("%d\n", i+1);
	}

	return 0;
}
#include <stdio.h>
#include <limits.h>
#define N 1000

int l[N + 1];


int main()
{
	int n, x0, y0, i, j, x, y;
	
	scanf("%d%d%d", &n, &x0, &y0);
	for (i = 0; i < n; i++) {
		scanf("%d%d", &x, &y);
		l[i] = (x0 - x) * (x0 - x) + (y0 - y) * (y0 - y);
	}
	for (i = 0; i < 3; i++)
	{
		int min = INT_MAX;
		for (j = 0; j < n; j++)
			if (l[j] < min)
				min = l[j];
		for(j = 0; j < n; j++)
			if (min == l[j])
			{
				printf("%d\n", j + 1);
				l[j] = INT_MAX;
				break;
			}
	}

	return 0;
}

202006-1 线性分类器

自己写的只有50分

#include <iostream>
using namespace std;
const int N = 1000;

int main()
{
	int n, m, t1, t2, t3, d1, d2, judge = 0, i, j = 0, i1 = 0, i2 = 0;
	char c;
	int a1[N], a2[N], b1[N], b2[N];
	bool ju, is = true;

	cin >> n >> m;

	for (i = 0; i < n; i++)
	{
		cin >> d1 >> d2 >> c;
		if (c == 'A')
			judge = 1;
		if (c == 'B')
			judge = 2;
		switch (judge)
		{
		case 1:
			a1[i1] = d1;
			a2[i1] = d2;
			i1++;
			break;
		case 2:
			b1[i2] = d1;
			b2[i2] = d2;
			i2++;
			break;
		default:
			break;
		}
	}

	for (i = 0; i < m; i++)
	{
		cin >> t1 >> t2 >> t3;

		ju = (t1 + t2 * a1[j] + t3 * a2[j]) > 0;
		for (j = 0; j < i1; j++) 
			if (ju == (t1 + t2 * a1[j] + t3 * a2[j]) > 0)
				is = true;
			else {
				is = false;
				break;
			}

		if (is == true)
		{
			j = 0;
			ju = (t1 + t2 * b1[j] + t3 * b2[j]) > 0;
			for (j = 0; j < i2; j++)
				if (ju == (t1 + t2 * b1[j] + t3 * b2[j]) > 0)
					is = true;
				else {
					is = false;
					break;
				}
		}
		if (is)
			cout << "Yes" << endl;
		else
			cout << "No" << endl;
	}

	return 0;
}

参考了一下题解,修改后的:

#include <iostream>
using namespace std;

const int N = 1000;
int a1[N], a2[N];
char s[N];

int main()
{
	int n, m, t1, t2, t3, i, judge;
	char ju_fir, ju_sec;

	cin >> n >> m;

	for (i = 0; i < n; i++)
		cin >> a1[i] >> a2[i] >> s[i];

	for (int j = 0; j < m; j++)
	{
		judge = 1;
		ju_fir = 'm'; ju_sec = 'n';
		cin >> t1 >> t2 >> t3;

		for (i = 0; i < n; i++) {
			if (t1 + t2 * a1[i] + t3 * a2[i] > 0)
				ju_fir = s[i];
			else
				ju_sec = s[i];
			if (ju_fir == ju_sec) {
				judge = 0;
				break;
			}
		}
		
		if (judge)
			cout << "Yes" << endl;
		else
			cout << "No" << endl;
	}

	return 0;
}

201912-1 报数

#include <iostream>
using namespace std;

int isseven(int); // 声明函数,作用是判断一个数里面有7或能被7整除 
int isseven(int n) // 定义函数 
{
	int i = n, j;
	while (i) // 判断这个数里面有7 
	{
		j = i % 10;
		if (j == 7)
			return 1;
		i /= 10;
	}
	if (n % 7 == 0) // 判断一个数能被7整除 
		return 1;
	else
		return 0;
}

int main()
{
	int n, i, j, ju, jia, yi, bin, ding;
	jia = yi = bin = ding = 0; // 初始化四个数均为0 

	cin >> n;

	for(i = 1, j = 1; i <= n; i++, j++)
		if (isseven(j)){
			i--; // 有一个人不报数就不会算进报的数里面 
			ju = j % 4; // ju的作用就是判断谁不报数 
			switch (ju)
			{
			case 1:
				jia++;
				break;
			case 2:
				yi++;
				break;
			case 3:
				bin++;
				break;
			default:
				ding++;
				break;
			}
		}

	cout << jia << endl << yi << endl << bin << endl << ding << endl;

	return 0;
}

201909-1 小明种苹果

#include <iostream>
#include <math.h>
#include <limits>
using namespace std;

int apple[1234][1234];
int s[1234]; // 每棵树的疏果个数

int main()
{
	int n, m, t, k, p, max;

	cin >> n >> m;
	// 输入每颗苹果树上的果子数和它们分别的疏果数目 
	for(int i = 0; i < n; i++)
		for (int j = 0; j < m + 1; j++)
			cin >> apple[i][j];
	
	// 初始化t和k为0 
	t = 0, k = 0;
	// t是没有进行疏果时的苹果总数 
	for (int i = 0; i < n; i++)
		t += apple[i][0];

	max = INT_MIN; // max代表疏果最多的果树的疏果数
	// 算出每棵树分别的疏果个数,最多疏果的果树个数为p 
	for (int i = 0; i < n; i++)
		for (int j = 1; j < m + 1; j++)
		{
			s[i] += abs(apple[i][j]);
			if (s[i] > max)
				max = s[i];
		}
	p = max;
	
	// 找到疏果最多果树的编号为k 
	for (int i = 0; i < n; i++)
		if (s[i] == max){
			k = i + 1;
			break;
		}
	// 减去疏果数就是最后的总果数 
	for (int i = 0; i < n; i++)
		t -= s[i];

	cout << t << " " << k << " " << p << endl;

	return 0;
}

201903-1 小中大

#include <iostream>
#define N 100000
using namespace std;

int s[N + 1];

int main()
{
	int n, max, min, ju;
	double mm;

	cin >> n;
	// 这里最好用 for循环一次性全赋值,单独给max和min可能会把自己搞蒙
	for (int i = 0; i < n; i++)
		cin >> s[i];
	
	max = s[0]; min = s[n - 1];

	if (n & 1)
		mm = s[n / 2];
	else
		mm = ((double)s[n / 2] + s[n / 2 - 1]) / 2;

	if (max < min)
	{
		int t = max;
		max = min;
		min = t;
	}
	ju = mm;
	if(mm == ju)
		printf("%d %d %d", max, ju, min);
	else
		printf("%d %.1lf %d", max, mm, min);

	return 0;
}

201812-1 小明上学

#include <iostream>
using namespace std;

int main()
{
	int r, y, g, n, sum = 0, k, t;
	
	// 输入三个数,分别是红灯、黄灯和绿灯 
	cin >> r >> y >> g;
	// 输入条件个数 
	cin >> n;
	while (n--)
	{
		cin >> k >> t;
		switch (k) // 判断k以确定红绿灯的颜色 
		{
		case 0: 
			sum += t;
			break;
		case 1:
			sum += t;
			break;
		case 2: // 黄灯的时候,要再等一个红灯 
			sum += t + r;
			break;
		default: // 绿灯不需要等待 
			break;
		}
	}
	// 输出小明用的时间 
	cout << sum << endl;

	return 0;
}

201809-1 卖菜

#include <iostream>
#define N 1000
using namespace std;

// 确定两个数组,分别是前一天和后一天的菜价。 
int s[N + 1], r[N + 1];

int main()
{
    int n;

    cin >> n; // n代表着有几家菜店 
    for (int i = 1; i <= n; i++)
        cin >> s[i];

	// 把第一家菜店和最后一家的分别按照特殊情况计算 
    r[1] = (s[1] + s[2]) / 2;
    r[n] = (s[n] + s[n - 1]) / 2;

	// 计算相邻三家店的平均值 
    for (int i = 2; i < n; i++)
        r[i] = (s[i - 1] + s[i] + s[i + 1]) / 3;

	// 输出每家店的菜价 
    for (int i = 1; i <= n; i++)
        cout << r[i] << " ";

    return 0;
}

201803-1 跳一跳

#include <stdio.h>

int main()
{
	int i, sum = 0, j, a, p = 2;

	for (i = 0;; i++)
	{
		scanf("%d", &j);
		if (j == 1) {
			p = 2;
			sum += 1;
			a = 1;
		}
		else if (j == 2 && i == 0 || j == 2 && a == 1) {
			sum += p;
			a = 2;
			p += 2;
		}
		else if (j == 2 && a == 2) {
			sum += p;
			p += 2;
		}
		else if (j == 0)
			break;
	}
	printf("%d", sum);

	return 0;
}

201712-1 最小差值

#include <stdio.h>
#include <limits.h>
#define N 1000

int s1[N + 1], s2[N + 1];
void bubblesort(int s[], int);
void bubblesort(int s[], int n)
{
	int i, j;
	for(i = n - 1; i > 0; i--)
		for(j = 1; j <= i; j++)
			if (s[j - 1] > s[j])
			{
				int t = s[j];
				s[j] = s[j - 1];
				s[j - 1] = t;
			}
}

int main()
{
	int n, i, min;
	
	scanf("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%d", &s1[i]);

	bubblesort(s1, n);
	for (i = 0; i < n - 1; i++)
		s2[i] = s1[i + 1] - s1[i];

	min = INT_MAX;

	for(i = 0; i < n - 1; i++)
		if (min > s2[i])
			min = s2[i];

	printf("%d", min);

	return 0;
}

201312-1 出现次数最多的数

#include <iostream>
#include <string.h>
// 在CSP认证中要写明这个头文件,不然memset会报错,可以用cstring,而且不能用string,本地IDE不需要
#define N 10000
using namespace std;

int main()
{
	int n, t, max = 0, max_c = 0;
	// 这里将s数组定义为全局变量可以不用初始化s,而且能够减少一个警告使用栈太大,同时不必使用string.h头文件
	int s[N + 1];
	memset(s, 0, sizeof(s));  // 将数组中所有元素初始化为0

	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> t;
		s[t]++; // 这里的意思是把重复出现的越多s[t]的大小就会越大。
	}

	for (int i = 1; i <= 10000; i++)
		// 这里i代表的才是输入数据,所以小的先被判断
		// 后面即使出现了s[i] == max_c也不会换数据,实现输出最小的一个
		if (s[i] > max_c)
		{
			max = i; // 确定众数是几
			max_c = s[i];
		}
	cout << max << endl;

	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值