2019秋招 拼多多笔试编程题

题目一 最小回合数

血量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;
} 

猜你喜欢

转载自blog.csdn.net/behboyhiex/article/details/82228351