c++解题 - CSDN周赛第33期

第一题:奇偶排序
给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。

输入描述:第一行输入整数n。(1<=n<=1000)表示数组大小;第二行输入n个整数a.(1<=n<=100)

输出描述:输出重排之后的数组。

示例:

示例
输入    6
3 34 67 89 90 58
输出    3 67 89 34 90 58

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
using namespace std;
std::vector<int> solution(int n, std::vector<int>& vec){
std::vector<int> result;
// TODO:
for(auto& ite : vec)
if(ite & 1)
result.push_back(ite);
for(auto& ite : vec)
if(ite % 2 == 0)
result.push_back(ite);
return result;
}
int main() {
int n;
std::vector<int> vec;
std::cin>>n;
std::string line_0, token_0;
getline(std::cin >> std::ws,line_0);
std::stringstream tokens_0(line_0);
while(std::getline(tokens_0, token_0, ' ')){
vec.push_back(std::stoi(token_0));
}
std::vector<int> result = solution(n,vec);
for(auto it=result.begin();it!=result.end();++it){
std::cout<<*it<<" ";
}
std::cout<<std::endl;

第二题:小艺改编字符串

已知字符串str。添加至少多少字符可以使得str变成回文串。

输入描述:输入字符串s.(1<=len(str)<=100000)

输出描述:输出最小需要添加字符的数量。
示例:

示例
输入abab
输出

1

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 10001;
int f[N][N];
int solution(std::string s){
int res = 0;
string a = s;
reverse(s.begin(), s.end());
int n = a.size();
for(int i = 0; i < n; i ++)
for(int j = 0; j < n; j ++)
{
f[i + 1][j + 1] = max(f[i][j + 1], f[i + 1][j]);
if(a[i] == s[j])
f[i + 1][j + 1] = max(f[i + 1][j + 1], f[i][j] + 1);
}
res = n - f[n][n];
// TODO:
return res;
}
int main() {
std::string s;
getline(std::cin, s);;
int result = solution(s);
std::cout<<result<<std::endl;
return 0;
}

第三题:公司新表

公司里为了凸显公司的特性。安装了一个n进制表。已知新的表的时间是”H:M”。时间合法的定义为H<=23 && M<=59。时间有多少种进制定义的方式,依次打印出来。如果有无数种解输出”-1”,不存在输出”0”。

输入描述:输入一行字符串a:b形式。

输出描述:输出答案。

示例:

示例
输入    11:20
输出    3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int get(char c) {
if (c >= '0' && c <= '9') return c - '0';
else return c - 'A' + 10;
}
std::vector<int> solution(std::string m) {
std::vector<int> res;
int t = 0;
int n = m.size();
for(int i = 0; i < n; i++) {
if(m[i] == ':') continue;
t = max(t, get(m[i]));
for(int i = t + 1; i <= 60; i++) {
int b[2] = {0, 0};
int p = 0;
for(int j = 0;j < n;j++) {
if(m[j] == ':') {
p++;
continue;
}
int q = get(m[j]);
b[p] = b[p] * i + q;
}
if(b[0] >= 24 || b[1] >= 60) break;
else res.push_back(i);
}
if (!res.size()) {
return {0};
} else if(res.back() == 60) return {-1};
return res;
}
int main() {
std::string m;
getline(std::cin, m);;
std::vector<int> result = solution(m);
for(auto it=result.begin(); it!=result.end(); ++it) {
std::cout<<*it<<" ";
}
std::cout<<std::endl;
return 0;
}

第四题:选择客栈

丽江河边有 n 家很有特色的客栈,客栈按照其位置顺序从 1 到 n 编号。每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费。两位游客一起去丽江旅游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中。晚上,他们打算选择一家咖啡店喝咖啡,要求咖啡店位于两人住的两家客栈之间(包括他们住的客栈),且咖啡店的最低消费不超过 p 。他们想知道总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过 p 元的咖啡店小聚。

输入描述:共n+1 行。第一行三个整数 n ,k ,p ,每两个整数之间用一个空格隔开,分别表示客栈的个数,色调的数目和能接受的最低消费的最高值;接下来的 n 行,第 i+1 行两个整数,之间用一个空格隔开,分别表示 i 号客栈的装饰色调和 i 号客栈的咖啡店的最低消费。

输出描述:一个整数,表示可选的住宿方案的总数。

示例:

示例
输入    5 2 3
0 5
1 3
0 2
1 4
1 5
输出    3
 

#include<cstdio>
#include <iostream>
#include <vector>
using namespace std;
int n,k,p,t,ans,price,num[110],color[200100];
int main()
{
cin >> n >> k >> p;
for(int i=1;i<=n;i++)
{
cin >> color[i] >> price;
if(price<=p)
{
for(int j=i;j>t;j--) num[color[j]]++;
t=i,ans+=num[color[i]]-1;
}
else ans+=num[color[i]];
}
printf("%d",ans);
return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值