题目一 最小回合数
血量hp,每个回合可以蓄力也可以攻击,蓄力后下次攻击加成,造成buff伤害,普通攻击造成norm伤害,问最少回合
输入:
hp
norm
buff
输出:最小回合
样例输入:
13
3
5
样例输出:
5
#include <iostream>
using namespace std;
int main() {
int hp,a,b,res;
cin>>hp>>a>>b;
if(2*a>=b) cout<<(hp+a-1)/a<<endl;
else{
res=hp/b*2;
int temp=hp%b;
if(temp!=0 && temp<=a) res+=1;
else if(temp!=0 && temp>a) res+=2;
cout<<res<<endl;
}
return 0;
}
题目二 竖着的棋盘
棋盘中'o'表示可移动障碍木头,'x'表示固定障碍石头,'.'表示什么也没有
当棋盘竖起来时,木头会下落,如果没有石头阻挡,会掉落下去,有石头会叠在石头上。
输入 一个棋盘,输出竖起后的棋盘
样例输入:
3 4
.oxo
o..o
.xox
样例输出:
..xo
.o.o
.x.x
思路:
自底向上遍历每一列 初始设置石头位置为-1,
如果为‘x’时,标记pre为当前位置
如果为‘o’,此时pre!=-1 将当前位置设为'.',pre-1位置设为‘o’,pre--
代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
char st[30][30];
int n,m;
cin>>n>>m;
for (int i = 1; i <= n; ++i) {
scanf("%s", st[i] + 1);
}
for(int j=1;j<=m;j++){
int pre=-1;
for(int i=n;i>=1;i--){
if(st[i][j]=='x'){
pre=i;
}
else if(st[i][j]=='o'){
if(pre!=-1){
st[i][j]='.';
st[pre-1][j]='o';
pre=pre-1;
}
else st[i][j]='.';
}
}
}
for (int i = 1; i <= n; ++i) {
printf("%s\n", st[i] + 1);
}
return 0;
}
题目三:循环小数的初始位置与长度
给定两个数啊a,b,求循环小数的循环初始位置和循环节长度
若不是循环小数,输出结束位置和0
样例输入
1 3
样例输出
0 1
样例输入
5 4
样例输出
2 0
#include<bits/stdc++.h>
using namespace std;
#define mst(a, b) memset(a, b, sizeof a)
const int qq = 1e6 + 300;
int rem[qq];
int main() {
mst(rem, -1);
int a, b;
cin>>a>>b;
if (a % b == 0) {
printf("%d 0\n", 0);
return 0;
}
int temp = a % b;
int tot = 0;
bool f = false;
while (rem[temp] == -1) {
rem[temp] = ++tot;
temp *= 10;
temp %= b;
if (temp == 0) {
f = true;
break;
}
}
if (f) {
printf("%d 0\n", tot);
} else {
printf("%d %d\n", rem[temp] - 1, tot - rem[temp] + 1);
}
return 0;
}
题目四:组合最小字典序输出
给定n组单词,每组m个字符,字符在A-Z之间
新单词的第i位从所有组第i位取出最小的字符,组成最小未出现的单词
输入:
3 4
COKM
MAQQ
ZAWE
输出 CAKE
#include<bits/stdc++.h>
using namespace std;
int n, m;
string str[2005];
unordered_map<string, bool> mp;
vector<char> vt[2005];
int real_len[2005];
void handle(string x) {//string拆分成char
for (int i = 0; i < x.size(); ++i) {
vt[i].push_back(x[i]);
}
}
bool f = false;
void dfs(int cnt, string ans) {
if (f) return;
if (cnt == m) {
if (mp.find(ans) == mp.end()) {
cout << ans << endl;
f = true;
}
return;
}
for (int i = 0; i < real_len[cnt]; ++i) {
dfs(cnt + 1, ans + vt[cnt][i]);
}
}
int main() {
std::ios::sync_with_stdio(false);//取消cin与stdin的同步
cin >> n >> m;
for (int i = 0; i < n; ++i) {
cin >> str[i];
if (mp.find(str[i]) == mp.end()) {
mp[str[i]] = true;
handle(str[i]);
}
}
for (int i = 0; i < m; ++i) {
sort(vt[i].begin(), vt[i].end());
real_len[i] = unique(vt[i].begin(), vt[i].end()) - vt[i].begin();//unique去重,把不重复的元素移到前面
}
dfs(0, "");
if (!f) {
cout << "-" << endl;
}
return 0;
}