我是靠谱客的博主 淡然抽屉,最近开发中收集的这篇文章主要介绍CSDN竞赛17期题解总结题目列表,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

总结

最近不幸中招了,身体状态不佳,所以相关竞赛题解木有及时更新,大致的附上竞赛时的代码,后面有机会再补充完整。

题目列表

1.判断胜负

题目描述

已知两个字符串A,B。 连续进行读入n次。 每次读入的字符串都为A|B。 输出读入次数最多的字符串。

分析

本题考察简单的hash,比赛时还分了奇偶讨论,其实是没必要的。读入时给字符串记下数,然后遍历下hash表,输出value最大的key即可。

代码

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <unordered_map>
using namespace std;
unordered_map<string,int> m;
int main() {
	int n;
	cin>>n;
	string x;
	for(int i = 0; i < n; i++) {
		cin>>x;
		m[x]++;
	}
	if (n & 1) {
		if (m[x] > n / 2) cout<<x<<endl;
		else {
			for(auto s : m) {
				if(s.first != x) {
					cout<<s.first<<endl;
					break;
				}
			}
		}
	} else {
		if (m[x] == n / 2) cout<<"dogfall"<<endl;
		else if(m[x] > n / 2) cout<<x<<endl;
		else {
			for(auto s : m) {
				if(s.first != x) {
					cout<<s.first<<endl;
					break;
				}
			}
		}
	}
	return 0;
}

2.买铅笔

题目描述

P老师需要去商店买n支铅笔作为小朋友们参加编程比赛的礼物。她发现商店一共有 3 种包装的铅笔,不同包装内的铅笔数 量有可能不同,价格也有可能不同。为了公平起 见,P老师决定只买同一种包装的铅笔。 商店不允许将铅笔的包装拆开, 因此P老师可能需要购买超过 n 支铅笔才够给小朋 友们发礼物。 现在P老师想知道,在商店每种包装的数量都足够的情况 下,要买够至少 n 支铅笔最少需要花费多少钱。

分析

简单的枚举题目,枚举下买每种包装的铅笔不少于n支需要花费的钱数,取其中最小值即可。

代码

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
	int n;
	int arr[3][2];
	std::cin>>n;
	std::string token;
	for (size_t i = 0; i < 3; i++) {
		for (size_t j = 0; j < 2; j++) {
			std::cin>>token;
			arr[i][j] = std::stoi(token);
		}
	}
	int res = 1e9;
	for(int i = 0; i < 3; i++) {
		int num = arr[i][0], p = arr[i][1];
		int s = (n + num - 1) / num * p;
		res = min(res, s);
	}
	cout<<res<<endl;
	return 0;
}

3. 拯救爱情

题目描述

小艺酱走到一个花之占卜店中。 店员小Q看到小艺酱可怜的样子,允许小艺酱免费占卜一次。 花瓣占卜: 1. 一瓣“在一 起”,一瓣“不在一起”;开始的花瓣表示“在一起”。 2. 直到最后一个花瓣落地游戏结束。 3. 可以选择多朵花,选择撕一 朵花就必须撕完。

输入描述:

第一行输入花的数量n。(1<=n<=1000)
第二行输入每朵花的花瓣数量。(1<=an<=1e5)

输出描述:

输出小艺酱最多撕下了多少花瓣结果还是在一起。

输入样例:

1
1

输出样例:

1

分析

这次比赛最坑的一题,本来是一道水题,大部分人却只能通过七成用例,只有榜首不知道用了什么奇淫技巧ac了。

题目意思是选择若干朵花,使得花瓣总数是奇数。因此只需要将所有花瓣数量加起来,如果和是奇数,就是答案;如果和是偶数,就减去最小的奇数。

代码

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
ll solution(int n, std::vector<int>& vec) {
	ll res = 0;
	sort(vec.begin(), vec.end());
	for (auto x : vec) res += x;
	if (res & 1) return res;
	int t = -1;
	for(auto x : vec) {
		if(x & 1) {
			t = x;
			break;
		}
	}
	if (t == -1) return 0;
	return res - t;
}
int main() {
	int n, x;
	std::vector<int> vec;
	cin>>n;
	for(int i = 0; i < n; i++) {
		cin>>x;
		vec.push_back(x);
	}
	ll result = solution(n, vec);
	std::cout<<result<<std::endl;
	return 0;
}

4.题目名称:拯救公主

题目描述

在Flower Kingdom里,住着一位美丽的公主Ana,有一天Ana得了一种怪病,神医告知国王,在遥远的幽谷中有一种药 能治愈Ana, 但是神医只有一份不完整的地图,地图的描述如下: 该地图的共有3行,第一行有m列,m为奇数,第二行有m+1列,第三行有m+2列; 每一行用一个字符串表示,只有【两种字符】;‘.'表示草地,可以从它上面通过,‘’表示岩石,每一行最多一个‘’; 入口 在左上角,由于在对角线方向上,因此即使对角线两边都有岩石,但是缝隙较大,人可以通过,故人可以向八个方向行 走; 真实地图是由该地图的【每一行无限循环】得到的,这种神奇的药草就生长在第x行第y列的草地上,药草可能会在岩石上; 国王决定派遣勇敢的骑士David前去寻找拯救公主的解药; 现在聪明的你是否知道David能否找到该药?

输入描述:

第一行一个T表示组数,接下来每个测试用例
m(1<m<1000)x(1<=x<=3),y(1<=y<=1e9);
三行字符串,长度为m,m+1,m+2;

输出描述:

每个测试用例
输出YES或者NO

输入样例:

1
3 1 10
..

…*…

输出样例:

NO

分析

这道题的难点在于不规则的图形加上每一行无限长。由于y最大可以达到1e9,所以显然直接遍历是不可取的,只能找规律。一个比较显然的规律是每经过m,m+1,m+2的最小公倍数列图形都是一样的,但是m最大是999,这三个数的最小公倍数可能相当大。我比赛时属于直接暴力求解的,超过了一定列直接判定为找不到,为什么是找不到呢?因为后台数据结果是找不到(这种输出很单一的题目是很好水过的)。当然这种方法还是不推荐的,其他解法后面有机会再进行补充。

代码

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int N = 120000;
vector<string> vec;
int m;
bool st[3][N];
bool d[3][N];
int dx[8] = {0, 0, 1, 1, 1, -1, -1, -1};
int dy[8] = {1, -1, 0, 1, -1, 0, 1, -1};
bool get(int i,int j) {
	j = j % (m + i);
	if (vec[i][j] == '.') return true;
	return false;
}
bool bfs(int x, int y) {
	if (vec[0][0] == '*') return false;
	queue<pair<int,int> > q;
	d[0][0] = true;
	q.push({0, 0});
	st[0][0] = true;
	while(q.size()) {
		auto u = q.front();
		q.pop();
		int x1 = u.first, y1 = u.second;
		for(int i = 0; i < 8; i++) {
			int nx = x1 + dx[i], ny = y1 + dy[i];
			if (nx >= 3 || nx < 0 || ny < 0 || ny > y + 1000 || !get(nx ,ny) || st[nx][ny]) continue;
			if(nx == x && ny == y) return true;
			d[nx][ny] = true;
			q.push({nx, ny});
			st[nx][ny] = true;
		}
	}
	return false;
}
int main() {
	int T;
	std::cin>>T;
	for(int i=0; i<T; i++) {
		memset(st,false, sizeof st);
		memset(d, false, sizeof d);
		int x;
		int y;
		std::cin>>m;
		std::cin>>x;
		std::cin>>y;
		std::string token;
		for(size_t i=0; i<3; i++) {
			std::cin>>token;
			vec.push_back((token));
		}
		x--,y--;
		if(bfs(x,y) && y < 1e5) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
		vec.clear();
	}
	return 0;
}

最后

以上就是淡然抽屉为你收集整理的CSDN竞赛17期题解总结题目列表的全部内容,希望文章能够帮你解决CSDN竞赛17期题解总结题目列表所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部