CSDN竞赛50期题解

这篇具有很好参考价值的文章主要介绍了CSDN竞赛50期题解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

总结

CS行业隔行如隔山,基本用不上的书籍又又又增加了,刷刷做过的题目减缓下算法遗忘的速度吧。

比较有趣的一点是,有同学做完,会故意等很长时间再交卷;而有的做完发现排名不够就直接开小号再提交一遍刷排名,小号的昵称和代码都不改下,多少是有点瞧不起官方的审核了。

题目列表

1.订班服

题目描述

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

输入描述:

第一行输入一个整数n。(1<=n<=100)表示衣服的数量。
以下n行输入n个尺码。表示订单中衣服的尺码。
接下来n行输入n个尺码。小A订的衣服尺码。
尺码表:M,S,L,XL,XLL,XLLL,XLLLL,XLLLLL。

输出描述:

输出至少需要买多少件衣服。

输入样例:

2
XL
X
M
X

输出样例:

1

分析

本题的题目还是有一定歧义的,订单中衣服的尺码与小A订的衣服尺码语义差不多,不如直接说同学实际的衣服尺码和小A订的衣服尺码。虽然用例里每种尺码的衣服只出现了一次,但是后台用例里应该会出现很多重复尺码的衣服,因此不能使用set求差集大小的思路,可以使用map统计下每个尺码实际需要的数量,然后遍历小A订的尺码,只要实际的数量未达标,小A每订一件该尺码的衣服,还需要订的尺码数量就减一,最后统计下未达标尺码衣服的数量即可。

代码

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <map>
using namespace std;
map<string,int> m;
int main() {
	int n;
	cin>>n;
	for(int i = 0; i < n; i++) {
		string s1;
		cin>>s1;
		m[s1]++;
	}
	for(int i = 0; i < n; i++) {
		string s;
		cin>>s;
		if(m.count(s) && m[s]) {
			m[s]--;
		}
	}
	int res = 0;
	for(auto x : m) {
		res += x.second;
	}
	cout<<res<<endl;
	return 0;
}

2.异或和

题目描述

小张找到了一个整数 N,他想问问你从 1 到 N 的所有不同整数的异或和是多少, 请你回答他的问题。

输入描述:

第一行包含一个整数 N (1 <= N <= 100000)。

输出描述:

第一行输出一个整数, 代表从 1 到 N 的所有不同整数的异或和。

输入样例:

5

输出样例:

1

分析

虽然从二进制的角度分析,有更高效的做法可以快速统计出前N个整数的异或和,但是这么小的数据规模遍历一遍求下异或和,几十秒就可以AC了。

代码

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
using namespace std;
int solution(int N) {
	int res = 0;
	for(int i = 1; i <= N; i++) res ^= i;
	return res;
}
int main() {
	int N;
	std::cin>>N;
	int result = solution(N);
	std::cout<<result<<std::endl;
	return 0;
}

3.零钱兑换

题目描述

给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。
如果无解,请返回-1.

数据范围:数组大小满足 0 <= n <=10000 , 数组中每个数字都满足 0 < val <=10000,0 <= aim <=100000

要求:时间复杂度 O(n×aim) ,空间复杂度 O(aim)。

输入描述:

输出描述:

输入样例:

[5,2,3],20

输出样例:

4

分析

又是考过的题目,再刷一遍加深下印象。首先吐槽下输入,输入数组写成python列表的形式,给的c++或者python模板都只是读取了下字符串,没有很好的处理输入。上次做是直接用getchar和cin逐个读取的,这次是读取字符串后将前面数字部分切分为数组,处理输入大概还是写了一两分钟,有待提高。

状态表示: f [ i ] [ j ] f[i][j] f[i][j]表示前 i i i个货币面值组成 j j j元钱需要的最少货币数。

状态转移方程: f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j ] , f [ i − 1 ] [ j − k ∗ w [ i ] ] + k ) f[i][j]=max(f[i-1][j], f[i-1][j-k*w[i]] + k) f[i][j]=max(f[i1][j],f[i1][jkw[i]]+k),表示第 i i i个货币面值选 k k k次加上前面其它面值的货币可以达到 j j j元。

优化: f [ i ] [ j − w [ i ] ] = m a x ( f [ i − 1 ] [ j − w [ i ] ] , f [ i − 1 ] [ j − ( k + 1 ) ∗ w [ i ] ] + k ) f[i][j-w[i]]=max(f[i-1][j-w[i]], f[i-1][j-(k+1)*w[i]] + k) f[i][jw[i]]=max(f[i1][jw[i]],f[i1][j(k+1)w[i]]+k),假设 j j j w [ i ] w[i] w[i] t t t倍,那么枚举 f [ i ] [ j ] f[i][j] f[i][j]状态时,需要枚举

f [ i − 1 ] [ j ] , f [ i − 1 ] [ j − w [ i ] ] + 1 , . . . , f [ i − 1 ] [ j − t ∗ w [ i ] ] + t f[i-1][j],f[i-1][j-w[i]]+1,...,f[i-1][j-t*w[i]]+t f[i1][j],f[i1][jw[i]]+1,...,f[i1][jtw[i]]+t.

而枚举 f [ i ] [ j − w [ i ] ] f[i][j-w[i]] f[i][jw[i]]状态时,需要枚举

f [ i − 1 ] [ j − w [ i ] ] , f [ i − 1 ] [ j − 2 w [ i ] ] + 1 , . . . , f [ i − 1 ] [ j − t ∗ w [ i ] ] + t − 1 f[i-1][j-w[i]],f[i-1][j-2w[i]]+1,...,f[i-1][j-t*w[i]]+t-1 f[i1][jw[i]],f[i1][j2w[i]]+1,...,f[i1][jtw[i]]+t1.

可以发现 f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j ] , f [ i ] [ j − w [ i ] ] + 1 ) f[i][j]=max(f[i-1][j],f[i][j-w[i]]+1) f[i][j]=max(f[i1][j],f[i][jw[i]]+1),由于每层状态仅用到上一层相同列的状态和当前层左边的状态,所以可以使用滚动数组,顺序遍历枚举状态即可。

代码

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 10005;
int a[N];
int f[100005];
int main() {
	std::string s;
	getline(std::cin, s);
	int n = s.size();
	int idx = 0;
	int t = 0;
	for(int i = 1; i < n; i++) {
		if (s[i]==',') {
			a[idx++]=t;
			t = 0;
		} else if (s[i]!=']') {
			t = t * 10 + s[i] - '0';
		}
	}
	memset(f,0x3f,sizeof f);
	f[0]=0;
	for(int i = 0; i < idx; i++) {
		for(int j = a[i]; j <= t; j++) {
			f[j]=min(f[j],f[j-a[i]]+1);
		}
	}
	if (f[t]==0x3f3f3f3f) cout<<-1<<endl;
	else cout<<f[t]<<endl;
	return 0;
}

4.小艺照镜子

题目描述

已知字符串str。
输出字符串str中最长回文串的长度。

输入描述:

输入字符串s.(1<=len(str)<=10000)

输出描述:

输出答案

输入样例:

abab

输出样例:

3

分析

比赛时扫了眼题目以为是补充最少字符串使得原字符串变成回文串的问题,正写着LCS的DP解法发现理解错了,就是最简单的最长回文串长度的问题。这个问题题解写过很多了,马拉车算法和字符串哈希的线性解法固然复杂,但是平方级别的暴力解法还是可以秒掉的,基本不需要思考。文章来源地址https://www.toymoban.com/news/detail-437612.html

代码

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 10005;
int main() {
	std::string s;
	getline(std::cin, s);;
	int n = s.size();
	int res = 1;
	for(int i = 0; i < n; i++) {
		int p = i,q = i + 1;
		while(p>=0&&q<n&&s[p]==s[q]) p--,q++;
		res = max(res,q-p-1);
		p = i - 1,q = i + 1;
		while(p>=0&&q<n&&s[p]==s[q]) p--,q++;
		res = max(res,q-p-1);
	}
	cout<<res<<endl;
	return 0;
}

到了这里,关于CSDN竞赛50期题解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【LeetCode算法系列题解】第46~50题

    【题目描述】 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以按 任意顺序 返回答案。 【示例1】 【示例2】 【示例3】 【提示】 1 ≤ n u m s . l e n g t h ≤ 6 1le nums.lengthle 6 1 ≤ n u m s . l e n g t h ≤ 6 − 10 ≤ n u m s [ i ] ≤ 10 -10le nums[i]le 10 − 10 ≤ n u

    2024年02月10日
    浏览(10)
  • 2022 年辽宁省大学生程序设计竞赛 个人题解

    title : 2022 年辽宁省大学生程序设计竞赛 date : 2022-10-25 tags : ACM,练习记录 author : Linno 题目链接:https://ac.nowcoder.com/acm/contest/43937 进度:10/13 质量比较差的场,后三题是错的,D题spj也是错的,其他nt题也多。 A-伟大奋斗 B-可莉的五子棋 枚举每个点作为起点向下统计就行了。 C-消

    2023年04月08日
    浏览(11)
  • 2019湖南省大学生程序设计竞赛题解(D)

    很妙的类似区间dp, 我自己是想不到,本题解题思路来自学长的博客: 长沙橘子猫 题意 有一个长度为 n n n 的序列,你可以给每个位置填 0 ∼ 9 0sim9 0 ∼ 9 的一个数,有 m m m 个限制,每个限制 [ l i , r i ] [l_{i}, r_{i}] [ l i ​ , r i ​ ] 要求区间内的数相乘必须为 9 9 9 的倍数,问

    2023年04月15日
    浏览(30)
  • 蓝桥 卷“兔”来袭编程竞赛专场-03破解三角形密码 题解

    挑战介绍 三角形密码指的是将一串字符串按照正直角三角形的形状排列,传递的信息隐藏在每一行的最后一个字符,然后将所有的行的最后一个字符依次连接,就是需要传递的信息。 例如加密后的字符串是:我们爱的是蓝色的心桥 将加密字符串按照正直角三角形填充后如下

    2023年04月16日
    浏览(10)
  • 【超好懂的比赛题解】2021 年四川省大学生程序设计竞赛

    title : 2021 年四川省大学生程序设计竞赛 date : 2022-7-18 tags : ACM,练习记录 author : Linno 题目链接:https://codeforces.com/gym/103117 进度:11/13 切题顺序:AKMBDHLJ IF赛后补了,CG没看 A. Chuanpai 给定正整数 k,问有多少正整数对 (x, y) 满足 x + y = k 且 1 ≤ x ≤ y ≤ 6。 x 和 y 的可行范围很小,

    2024年02月05日
    浏览(11)
  • 2022第四届长安杯电子取证竞赛 服务器赛时思路&题解 Zodi4c

    VC容器密码为:2022.4th.changancup! 我赛时的做题思路和关心老师的讲解基本一致,只是没了上帝视角,本人只开了服务器,所以案件的关联性方面会差点,专注于服务器本身,以及比赛时是如何思考的。 队伍分工为本人服务器,毛同学为PC+基础检材分析,刘同学为手机+apk+exe逆

    2024年02月02日
    浏览(31)
  • Excel - VBA的隔行拷贝功能

    现在有个需求,要把2,3,4列内容隔行拷贝: 拷贝完效果:     如果行数较少,那手动Ctrl+C/V即可,但如果很多行的话,就应该想办法减少重复工作,提高效率,叫做磨刀不误砍柴工。 所以,先把手动操作录制一个宏,在此基础上再使用VBA编程修改一下。 因为要在多个Wor

    2024年02月11日
    浏览(11)
  • excel隔行取数求和/均值

    如图有好多组数据,需要求每组数据对应位置的平均值 然后下拉右拉扩充即可,其中需要根据自身需要修改一些数据 得到的是单元格对应的行数或是多个行数 因此列是多少无所谓,重要的是起始行与结束行确定数据范围,并使用$固定数字,防止拉伸数据时变动。比如本案例

    2024年02月12日
    浏览(10)
  • 网吧掉线的解决经验总结

    确实,网吧掉线会给网吧的运营带来致命的打击。如果网吧网络不稳定,一切运营方法都是徒然的。就因为如此,现在有人还专门从事攻击网吧的勾当。所以网吧对于这类攻击不得不防,下面就是一个老网吧技术网管总结出来的网吧掉线及解决方法的经验和工具下载,请认真

    2024年02月05日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包