CSDN周赛29题解-订班服、争抢糖豆、走楼梯、打家劫舍

文章提出了对CSDN竞赛的改进建议,包括增加原创题目以减少作弊可能性,设定固定结束时间,以及调整难度以提高区分度。同时,分享了CSDN周赛29的四道题目的解题思路,涉及衣物订购、概率计算、动态规划等算法问题。
摘要由CSDN通过智能技术生成

给CSDN竞赛的建议

1、希望多出一些原创题目、本次四道题目基本都是非原创题目,增加了作弊的可能性
2、可以模仿Leetcode周赛,设置固定的比赛结束时间,能够一定程度上遏制多账号提交作弊的情况
3、希望考试难度呈现梯度式、适当防AK、增加区分度
祝贵站竞赛越办越好~

CSDN周赛29题解

订班服

小A班级订班服了! 可是小A是个小糊涂鬼,整错了好多人的衣服的大小。 小A只能自己掏钱包来补钱了。 小A想知道自己至少需要买多少件衣服。

#include <bits/stdc++.h>
using namespace std;
int a[10], b[10];
int main()
{
	int n;
	cin >> n;
	string s;
	for (int i = 1; i <= n; ++i) {
		cin >> s;
		if (s == "M") a[1] ++;
		else if (s == "S") a[2]++;
		else if (s == "XL") a[3]++;
		else if (s == "XLL") a[4]++;
		else if (s == "XLLL") a[5]++;
		else if (s == "XLLLL") a[6]++;
		else if (s == "XLLLLL") a[7]++;
		else if (s == "L") a[8]++;
	}
	for (int i = 1; i <= n; ++i) {
		cin >> s;
		if (s == "M") b[1] ++;
		else if (s == "S") b[2]++;
		else if (s == "XL") b[3]++;
		else if (s == "XLL") b[4]++;
		else if (s == "XLLL") b[5]++;
		else if (s == "XLLLL") b[6]++;
		else if (s == "XLLLLL") b[7]++;
		else if (s == "L") b[8]++;
	}
	int res = 0;
	for (int i = 1; i <= 8; ++i) {
		if (a[i] > b[i]) res += (a[i] - b[i]);
	}
	cout << res << endl;
	return 0;
}

抓糖豆

抓糖豆,小Q与小K都喜欢吃糖豆。 但是糖豆分两种,超甜糖豆和普通糖豆。 现在有w个超甜糖豆和b个普通糖豆。 小Q和小K开始吃糖豆,他们决定谁先吃到超甜糖豆谁就获胜。 小K每次吃的时候会捏碎一颗糖豆。 小Q先吃,小Q想知道自己获胜的概率。 如果两个人都吃不到超甜糖豆小K获胜。

#include<iostream>
#include<cstdio>
using namespace std;
double dp[1010][1010];
int main()
{
	int w, b;
	cin >> w >> b;
	for (int i = 1; i <= w; ++i) dp[i][0] = 1;
	for (int i = 0; i <= b; ++i) dp[0][b] = 0;
	for (int i = 1; i <= w; ++i) {
		for (int j = 0; j <= b; ++j) {
			dp[i][j] = (double)i / (i + j);
			if (j >= 2) dp[i][j] += ((double)j / (i + j) * (j - 1) / (i + j - 1) * i / (i + j - 2) * dp[i - 1][j - 2]);
			if (j >= 3) dp[i][j] += ((double)j / (i + j) * (j - 1) / (i + j - 1) * (j - 2) / (i + j - 2) * dp[i][j - 3]);
		}
	}
	printf("%0.9lf", dp[w][b]);
	return 0;
}

走楼梯

现在有一截楼梯,根据你的腿长,你一次能走 1 级或 2 级楼梯,已知你要走 n 级楼梯才能走到你的目的楼层,请实现一个方法,计算你走到目的楼层的方案数。

#include <bits/stdc++.h>
using namespace std;
int dp[100];
int main()
{
	int n;
	cin >> n;
	dp[1] = 1, dp[2] = 2;
	for (int i = 3; i <= n; ++i) {
		dp[i] = dp[i - 1] + dp[i - 2];
	}
	cout << dp[n];
}

打家劫舍

一个小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

#include <bits/stdc++.h>
using namespace std;
int dp[110][2], w[110];
int main()
{
	int n;
	cin >> n;
	for (int i = 1; i <= n; ++i) cin >> w[i];
	for (int i = 1; i <= n; ++i) {
		dp[i][1] = dp[i - 1][0] + w[i];
		dp[i][0] = max(dp[i - 1][1], dp[i - 1][0]);
	}
	cout << max(dp[n][1], dp[n][0]);
	return 0;
}
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值