1059 C语言竞赛
分数 20
作者 CHEN, Yue
单位 浙江大学
C 语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛。既然竞赛主旨是为了好玩,颁奖规则也就制定得很滑稽:
- 0、冠军将赢得一份“神秘大奖”(比如很巨大的一本学生研究论文集……)。
- 1、排名为素数的学生将赢得最好的奖品 —— 小黄人玩偶!
- 2、其他人将得到巧克力。
给定比赛的最终排名以及一系列参赛者的 ID,你要给出这些参赛者应该获得的奖品。
输入格式:
输入第一行给出一个正整数 N(≤104),是参赛者人数。随后 N 行给出最终排名,每行按排名顺序给出一位参赛者的 ID(4 位数字组成)。接下来给出一个正整数 K 以及 K 个需要查询的 ID。
输出格式:
对每个要查询的 ID,在一行中输出
ID: 奖品,其中奖品或者是Mystery Award(神秘大奖)、或者是Minion(小黄人)、或者是Chocolate(巧克力)。如果所查 ID 根本不在排名里,打印Are you kidding?(耍我呢?)。如果该 ID 已经查过了(即奖品已经领过了),打印ID: Checked(不能多吃多占)。输入样例:
6 1111 6666 8888 1234 5555 0001 6 8888 0001 1111 2222 8888 2222输出样例:
8888: Minion 0001: Chocolate 1111: Mystery Award 2222: Are you kidding? 8888: Checked 2222: Are you kidding?
#include<iostream>
#include<vector>
#include<map>
#include<cmath>
#include<set>
using namespace std;
bool is_prime(int p) {
if (p < 2) {
return false;
}
else if (p == 2) {
return true;
}
else if (p % 2 == 0) {
return false;
}
else {
for (int i = 3; i <=sqrt(p); i += 2) {
if (p % i == 0) {
return false;
}
}
return true;
}
}
int main() {
int n;
cin >> n;
map<string, int> arr;
for (int i = 0; i < n; i++) {
string s;
cin >> s;
arr[s] = i + 1;
}
int m;
cin >> m;
set<string> same;
for (int i = 0; i < m; i++) {
string s;
cin >> s;
if (arr.find(s) == arr.end()) {
cout << s << ": Are you kidding?" << endl;
}
else if (same.find(s) != same.end()) {
cout << s << ": Checked" << endl;
}
else if (arr[s] == 1) {
cout << s << ": Mystery Award" << endl;
}
else if (is_prime(arr[s])) {
cout << s << ": Minion" << endl;
}
else {
cout << s << ": Chocolate" << endl;
}
same.insert(s);
}
return 0;
}
1118 如需挪车请致电
分数 20
作者 陈越
单位 浙江大学
上图转自新浪微博。车主用一系列简单计算给出了自己的电话号码,即:
2/2=1、3+2=5、9=3、9=3、0%=0、叁=3、5−2=3、9/3=3、1×3=3、23=8、8/2=4,最后得到的电话号码就是 153 3033 3384。
本题就请你写个程序自动完成电话号码的转换,以帮助那些不会计算的人。
输入格式:
输入用 11 行依次给出 11 位数字的计算公式,每个公式占一行。这里仅考虑以下几种运算:加(
+)、减(-)、乘(*)、除(/)、取余(%,注意这不是上图中的百分比)、开平方根号(sqrt)、指数(^)和文字(即 0 到 9 的全小写汉语拼音,如ling表示 0)。运算符与运算数之间无空格,运算数保证是不超过 1000 的非负整数。题目保证每个计算至多只有 1 个运算符,结果都是 1 位整数。输出格式:
在一行中给出电话号码,数字间不要空格。
输入样例:
2/2 3+2 sqrt9 sqrt9 6%2 san 5-2 9/3 1*3 2^3 8/2输出样例:
15330333384
#include<iostream>
#include<string>
#include<cmath>
#include<vector>
#include<map>
using namespace std;
int main() {
map<string, int> f = {
{"ling",0},{"yi",1},{"er",2},{"san",3},{"si",4},{"wu",5},
{"liu",6},{"qi",7},{"ba",8},{"jiu",9}
};
vector<int> arr(11);
//注意题目说的是至多有一个运算符,也就是可能出现纯数字情况
for (int j = 0; j < 11; j++) {
string input;
cin >> input;
if (input[0] >= '0' && input[0] <= '9' &&input.size()!=1) {
string s = "";
s += input[0];
int i = 1;
//注意input.size()
while (i < input.size() && input[i] >= '0' && input[i] <= '9') {
s += input[i];
i++;
}
char t = input[i];
i++;
string e = input.substr(i);
if (t == '+') {
arr[j] = stoi(s) + stoi(e);
}
else if (t == '-') {
arr[j] = stoi(s) - stoi(e);
}
else if (t == '*') {
arr[j] = stoi(s) * stoi(e);
}
else if (t == '/') {
if (stoi(e) == 0) {
arr[j] = 0;
}
else {
arr[j] = stoi(s) / stoi(e);
}
}
else if (t == '%') {
arr[j] = stoi(s) % stoi(e);
}
else if (t == '^') {
//stoi(e)-1==-1时是无符号比较
arr[j] = 1;
for (int i = 0; i < stoi(e); i++) {
arr[j] *= stoi(s);
}
}
}
else if(input.size()!=1){
if (input[0] == 's' && input[1] == 'q') {
string e = input.substr(4);
arr[j] = sqrt(stoi(e));
}
else {
arr[j] = f[input];
}
}
else if (input.size() == 1) {
arr[j] = stoi(input);
}
}
for (int i : arr) {
cout << i;
}
return 0;
}
1117 数字之王
分数 20
作者 陈越
单位 浙江大学
给定两个正整数 N1<N2。把从 N1 到 N2 的每个数的各位数的立方相乘,再将结果的各位数求和,得到一批新的数字,再对这批新的数字重复上述操作,直到所有数字都是 1 位数为止。这时哪个数字最多,哪个就是“数字之王”。
例如 N1=1 和 N2=10 时,第一轮操作后得到 { 1, 8, 9, 10, 8, 9, 10, 8, 18, 0 };第二轮操作后得到 { 1, 8, 18, 0, 8, 18, 0, 8, 8, 0 };第三轮操作后得到 { 1, 8, 8, 0, 8, 8, 0, 8, 8, 0 }。所以数字之王就是 8。
本题就请你对任意给定的 N1<N2 求出对应的数字之王。
输入格式:
输入在第一行中给出两个正整数 0<N1<N2≤103,其间以空格分隔。
输出格式:
首先在一行中输出数字之王的出现次数,随后第二行输出数字之王。例如对输入
1 10就应该在两行中先后输出6和8。如果有并列的数字之王,则按递增序输出。数字间以 1 个空格分隔,行首尾不得有多余空格。输入样例:
10 14输出样例:
2 0 8
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
using namespace std;
//计算位数和
int fun(int s) {
long long r = 1;
long long p = 0;
/*for (int i = 0; i < s.size(); i++) {
int t = (s[i] - '0');
r = r * t*t*t;
}*/
while (s) {
int t = s % 10;
r = r * t * t * t;
s /= 10;
}
while (r) {
p += r % 10;
r /= 10;
}
return p;
}
//判断是否都<=10
bool fun1(vector<long long> a) {
for (int i = 0; i < a.size(); i++) {
if (a[i] >= 10) {
return true;
}
}
return false;
}
int main() {
int a, b;
cin >> a >> b;
vector<long long> arr(b - a + 1);
for (int i = a; i <= b; i++) {
/*arr[i - a] = i;*/
arr[i - a] = i;
arr[i - a] = fun(arr[i - a]);
}
while (fun1(arr)) {
for (int i = a; i <= b; i++) {
/*arr[i - a] = i;*/
/*arr[i - a] = arr[i - a] * arr[i - a] * arr[i - a];*/
if (arr[i - a] == 0) continue;
arr[i - a] = fun(arr[i - a]);
}
}
//!!!找众数
map<long long, int> brr;
for (int i = 0; i < arr.size(); i++) {
brr[arr[i]] ++;
}
int m = 0;
int p = 0;
for (auto i : brr) {
if (i.second > m) {
m = i.second;
p = i.first;
}
}
vector<long long> r;
for (auto i : brr) {
if (i.second == m) {
r.push_back(i.first);
}
}
if (r.size() > 1) {
sort(r.begin(), r.end());
}
cout << brr[r[0]] << endl;
for (int i = 0; i < r.size(); i++) {
cout << r[i];
if (i != r.size() - 1) {
cout << " ";
}
}
return 0;
}

1327

被折叠的 条评论
为什么被折叠?



