T1
题目描述
Mirko很快厌倦了Jetpack Joyride并开始在他的手机上玩神奇宝贝GO。这个游戏的玩点之一就是神奇宝贝的进化。 为了进化物种为Pi的神奇宝贝,Mirko必须提供Ki个用于该物种神奇宝贝的糖果。在神奇宝贝进化后,他能拿回2个糖果。神奇宝贝只能在为他们的物种准备的糖果的帮助下进化。 Mirko有N种神奇宝贝,并且为物种Pi的神奇宝贝提供Mi个糖果,他想知道他可以进化多少次神奇宝贝。 他还想知道哪个神奇宝贝可以进化最多次。如果有多个这样的神奇宝贝,输出一个编号最小的神奇宝贝。换句话说,在输入数据中最早出现的那个。
输入
第一行输入包含整数N(1≤N≤70)。表示神奇宝贝种类的数量。接下来2N行包含N组数据,其中包含: ●第2i行包含字符串Pi,由最多20个字组成。表示第i种神奇宝贝的名称; ●第2i+1行包含整数Ki(12≤Ki≤400)和Mi(1≤Mi≤104),分别第i种神奇宝贝的进化所需的糖果数量和Mirko为这种神奇宝贝准备的糖果总数。
输出
第一行输出一个整数。表示Mirko可以进化的神奇宝贝的总次数。 第二行输出一个字符串。表示可以进化最多次的神奇宝贝的名称。
样例输入
4
Caterpie
12 33
Weedle
12 42
Pidgey
12 47
Rattata
25 71
样例输出
14
Weedle
题解
水题,按照题目模拟就能过
代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
const int N = 75;
string name, p;
int n, ans, maxn;
int k[N], m[N];
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i ++) {
int cnt = 0;
cin >> name;
scanf("%d%d", &k[i], &m[i]);
while(m[i] >= k[i]) {
cnt ++;
m[i] -= k[i];
m[i] += 2;
}
ans += cnt;
if(cnt > maxn)
p = name, maxn = cnt;
}
cout << ans << endl << p << endl;
}
T2
题目描述
小 Zeljko 一直在阁楼里读他奶奶的旧信,并且发现了一个长度为 N 的单词。 不幸的是,由于溢出的墨水,他不知道单词的内容。他把看不清的 M 个字母每 个字母都用一个字符’#‘替换后,在一张纸上重写了这个词。他把那张纸递给 了他的奶奶,对于每个看不清的字母,奶奶给了他 K 个不同的可能。在那之后, Zeljko 在笔记本中写下了所有可能的单词,并决定仔细查看他们的属性,以确 定原始单词是什么。在看到笔记本上写下的单词后,他的奶奶意识到他们正在 寻找的是按字典序排列的第 X 个单词。Zeljko 在他们学校学习字母表的那天生 病了,所以他要求你帮助他确定原来的单词。 输入 第一行输入包含整数 N,M,K 和 X(1≤N≤500,1≤M≤N,1≤K≤26,1≤X≤ 1e9)。分别表示单词的长度,看不清的字母的数量,奶奶给出的字母的数量和 原单词是字典序的第几个。 第二行输入包含一个长度为 N 的字符串,由小写英文字母和字符’#‘组成。 表示 Zeljko 找到的单词,其中字符’#'表示看不清的字母。 接下来 M 行中的每一行包含一个长度为 K 的字符串,由 K 个不同的小写英文 字母组成。第 2+i 行的 K 个字母表示第 i 个看不清的 保证 X 总是小于等于能构造出的单词的总数。
输入
第一行输入包含整数 N,M,K 和 X(1≤N≤500,1≤M≤N,1≤K≤26,1≤X≤ 1e9)。分别表示单词的长度,看不清的字母的数量,奶奶给出的字母的数量和 原单词是字典序的第几个。 第二行输入包含一个长度为 N 的字符串,由小写英文字母和字符’#‘组成。 表示 Zeljko 找到的单词,其中字符’#'表示看不清的字母。 接下来 M 行中的每一行包含一个长度为 K 的字符串,由 K 个不同的小写英文 字母组成。第 2+i 行的 K 个字母表示第 i 个看不清的字母的 K 种可能。 保证 X 总是小于等于能构造出的单词的总数。
输出
输出一个字符串。表示原本的单词。
样例输入
9 2 3 7
po#olje#i
sol
znu
样例输出
posoljeni
题解
比上一题难一点,但也不难想到正解
很显然一共有 k m k^m km种可能,所以对于按字典序排的第 x x x种可能的每一位我们只需要不断地向 k k k取模
假设我们需要确定第 i i i位,令 y = x % k y=x\%k y=x%k,那么第 i i i位的字母就是这个字母的所有可能中按字典序排第 y y y位的字母
代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 505;
const int K = 30;
int n, m, k, x, cnt, p, q;
char s[N], a[N][K], ans[N];
int main() {
scanf("%d%d%d%d\n", &n, &m, &k, &x);
gets(s + 1);
for