2023/02/21刷题
A. k-String
链接
我们先统计全部字母的数量,然后根据k的值来确定k次重复的每次字母的数量,之后生成字符串
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cstring>
#include <unordered_set>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <sstream>
#include <queue>
#define int long long
#define yes cout<<"YES"<<'\n'
#define no cout<<"NO"<<'\n'
using namespace std;
int st[30];
signed main () {
ios::sync_with_stdio(false);
int k;
cin >> k;
string s;
cin >> s;
for (int i = 0; i < (int)s.size(); i++) {
st[s[i] - 'a']++; //统计每个字符的数量
}
int flag = 1;
for (int i = 0; i <= 29; i++) { //统计每个字符的数量都可以被k整除
//只要有一个不能被整除就不能构成k个相同的字符串
if (st[i] % k != 0) {
flag = 0;
break;
}
}
if (flag == 1) {
string res;
int num = k;
while (num--) {//生成k个字符
for (int i = 0; i < 30; i++) {
if (st[i] != 0) {
int cnt = st[i] / k;//看当前字符每一次需要个
string temp;
while (cnt--) {
temp = temp + (char)(i + 'a');//生成当前的字符串
}
res = res + temp;//让res加上这个字符串
}
}
}
cout << res << '\n';//打印结果
} else {
printf("-1");//否则打印-1
}
return 0;
}
B. Petr and a Combination Lock
链接
B. Petr and a Combination Lock
这个题想了半天没有好方法看了一下竟然是暴力枚举时间复杂度是2的15次方.我直接进行dfs枚举答案
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cstring>
#include <unordered_set>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <sstream>
#include <queue>
#define int long long
#define yes cout<<"YES"<<'\n'
#define no cout<<"NO"<<'\n'
using namespace std;
int n;
int a[20];
int flag = 0;
int res = 0;
void dfs(int x) {
if (x > n) { //当递归结束的时候检查一下满不满足要求
if (res == 0 || res % 360 == 0) { //满足要求让flag++
flag++;
}
return ;
} else { //不满足条件进行递归
int temp = res;
res = res + a[x]; //让res+a[x]
dfs(x + 1); //递归到下一层
res = temp; //恢复现场
res = res - a[x]; //让res-a[x]
dfs(x + 1); //递归到下一层
res = temp; //恢复现场
}
}
signed main () {
ios::sync_with_stdio(false);
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
dfs(0);
//检查一下满足条件的个数
if (flag == 0) {
no;
} else {
yes;
}
return 0;
}
A. Level Statistics
链接
这个题就是统计比赛的每个时间点比赛的总数和比赛通过关的次数是不是合法,首先比赛进行的次数一定是大于等于比赛通关的次数的,两种情况后面的时间点的次数一定大于前面时间点的次数.然后两个时间点的差比赛次数一定大于等于通关次数
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cstring>
#include <unordered_set>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <sstream>
#include <queue>
#define int long long
#define yes cout<<"YES"<<'\n'
#define no cout<<"NO"<<'\n'
using namespace std;
struct data { //定义结构体
int x, y;
};
struct data a[105];
signed main () {
ios::sync_with_stdio(false);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i].x;
cin >> a[i].y; //读入数据
}
int flag = 1;
if (a[0].x < a[0].y) { //第一种情况比赛次数小于通关次数
flag = 0;
no;
continue;
}
for (int i = 1; i < n; i++) { //下面是非法情况
if (a[i].x < a[i - 1].x) { //x的后面时间点小于前面时间点
flag = 0;
break;
}
if (a[i].y < a[i - 1].y) { //y的后面时间点小于前面时间点
flag = 0;
break;
}
if (a[i].x < a[i].y) { //通关次数大于比赛次数
flag = 0;
break;
}
if (a[i].y - a[i - 1].y > a[i].x - a[i - 1].x) { //前后时间点通关次数大于了比赛次数
flag = 0;
break;
}
}
if (flag == 0) {
no;
} else {
yes;
}
}
return 0;
}