概述
总结
最近不幸中招了,身体状态不佳,所以相关竞赛题解木有及时更新,大致的附上竞赛时的代码,后面有机会再补充完整。
题目列表
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期题解总结题目列表所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复