T1:
如果你仍然再用二指禅打字,那我建议你重新学习打字,这样你打字会更快,感觉更舒适和愉快。
有很多网站教授正确的打字。下图描述了基本原理: 用同一手指按压颜色相同的键。黄色键需要用小指按压,蓝色的用无名指,绿色的用中指,红色的用食指。
另外,左手按键盘的左侧(从左侧的5、T、G、B键开始)右手按压右侧(从右侧的键6、Y、H、N开始)。拇指负责空格键。
图片描述的键盘是美式键盘。
现在,给出一段长度为 len(1≤len≤50) 的字符串,请你计算如果正确打出这个字符串,每个手指敲击键盘的次数。
输入格式:
输入为一行,一个由大写字母、数字和特殊符号组成的字符串(不包括空格,不需要管图片中未显示的按键)。
输出格式:
输出8行,表示左手小指、无名指、中指、食指以及右手食指、中指、无名指、小指敲击键盘的次数。
输入样例1:
AON=BOO;
输出样例1:
1
0
0
1
1
0
3
2
思路:本题就是简单的把键盘上的字母输出即可。
代码:
#include<iostream>
using namespace std;
int main()
{
int num[8] = {};
char ch;
while ((ch = getchar()) != EOF)
{
if (ch == 'Z' || ch == 'A' || ch == 'Q' || ch == '1')
num[0]++;
else if (ch == 'X' || ch == 'S' || ch == 'W' || ch == '2')
num[1]++;
else if (ch == 'E' || ch == 'D' || ch == 'C' || ch == '3')
num[2]++;
else if (ch == 'V' || ch == 'F' || ch == 'R' || ch == '4')
num[3]++;
else if (ch == 'B' || ch == 'G' || ch == 'T' || ch == '5')
num[3]++;
else if (ch == 'N' || ch == 'H' || ch == 'Y' || ch == '6')
num[4]++;
else if (ch == 'M' || ch == 'J' || ch == 'U' || ch == '7')
num[4]++;
else if (ch == ',' || ch == 'K' || ch == 'I' || ch == '8')
num[5]++;
else if (ch == '.' || ch == 'L' || ch == 'O' || ch == '9')
num[6]++;
else if (ch == '/' || ch == ';' || ch == 'P' || ch == '0')
num[7]++;
else if (ch == '[' || ch == ']' || ch == '\'' || ch == '-' || ch == '=')
num[7]++;
}
for (int i = 0;i < 8;i++)
cout << num[i] << endl;
return 0;
}
T2
有 N 根完全相同的香肠, 现在要平均分给 M 个客人。 问最少需要切几刀才能将其平均分给客人(不能多个香肠一起切)。
输入格式:
两个整数 N(1≤N≤105) 和 M(1≤M≤105)
输出格式:
一个整数,表示要切的刀数
输入样例:
在这里给出一组输入。例如:
2 6
输出样例:
在这里给出相应的输出。例如:
4
思路:将一根香肠代表数字1,先求出所有香肠放在一起平分需要切的大小N/M,所有N/M的倍数都要切一刀,如果正好是整数就不用切,最后的结果就是要切的刀数。
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
double N, M;
int ans = 0;
cin >> N >> M;
double num = 0;
double i = 1;
while (num < N)
{
num = (i*N / M);
i++;
int in = num;
if (num != (double)in )
ans++;
}
cout << ans;
return 0;
}
T3
学校的礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。小刘的工作就是安排学校礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排。
输入格式:
第一行是一个整型数m(m<100)表示共有m组测试数据。
每组测试数据的第一行是一个整数n(1<n<10000)表示该测试数据共有n个活动。
随后的n行,每行有两个正整数Bi,Ei(0<=Bi,Ei<10000),分别表示第i个活动的起始与结束时间(Bi<=Ei)
输出格式:
对于每一组输入,输出最多能够安排的活动数量。
每组的输出占一行
输入样例:
在这里给出一组输入。例如:
2
2
1 10
10 11
3
1 10
9 11
11 20
输出样例:
在这里给出相应的输出。例如:
2
2
思路:排序开始时间,将开始时间与结束时间比较寻找符合条件的,再选择符合条件的结束时间最早的
代码:
#include <bits/stdc++.h>
using namespace std;
int n, x;
struct M
{
int beg;
int ed;
}me[10000] = { {-1,-1} };
bool cmp(M& me, M& b)
{
return me.ed < b.ed;
}
int main()
{
cin >> n;
while (n--)
{
cin >> x;
for (int i = 1; i <= x; i++)
cin >> me[i].beg >> me[i].ed;
sort(me + 1, me + 1 + x, cmp);
int num = 1,j=1;
for (int i = 2;i <= x;i++)
{
if (me[i].beg >= me[j].ed)
//当下一个的会议开始时间比前一个结束时间要晚,则安排此会议
{
num++;
j = i;
}
}
cout << num << endl;
}
return 0;
}
T4
传说二战时X国收到了上帝的一串密码,只有解开密码,才能阻止战争的继续进行,世界才会恢复和平。解开密码的第一道工序就是解压缩密码,上帝对于连续的若干个相同的子串"X"会压缩为"[DX]"的形式(D是一个整数且1<=D<=99),比如说字符串"CBCBCBCB"就压缩为"[4CB]"或者"[2[2CB]]",类似于后面这种压缩之后再压缩的称为二重压缩。如果是"[2[2[2CB]]]"则是三重的。现在我们给你上帝发送的密码,请你对其进行解压缩。
输入格式:
一个字符串。
输出格式:
一个字符串。
输入样例:
在这里给出一组输入。例如:
AC[3FUN]
输出样例:
在这里给出相应的输出。例如:
ACFUNFUNFUN
思路:对每个输入的字符进行判断,遇到【后,输入数字,之后如果遇到字母,直接加到最终的字符串后。
代码:
#include <bits/stdc++.h>
using namespace std;
string D()
{
char c;
string str,ans;
while (cin >> c)
{
if (c == '[')
{
int n;
cin >> n;
str = D();
while (n >= 1)
{
ans += str;
n--;
}
}
else if (c == ']')
return ans;
else
ans += c;
}
return ans;
}
int main()
{
cout << D();
return 0;
}
T5
恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。
首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。
然后,让这 n 位大臣排成一排,国王站在队伍的最前面。
排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:
排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。
国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。
注意,国王的位置始终在队伍的最前面。
输入格式:
第一行包含一个整数 n(1≤n≤1000),表示大臣的人数。
第二行包含两个整数 a (0<a)和 b(b<10000),之间用一个空格隔开,分别表示国王左手和右手上的整数。
接下来 n 行,每行包含两个整数 a 和 b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。
输出格式:
输出只有一行,包含一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。
输入样例:
在这里给出一组输入。例如:
3
1 1
2 3
7 4
4 6
输出样例:
在这里给出相应的输出。例如:
2
思路:有中间两个人 i 和 i+1,显然他们俩怎么排对后面没有影响,记 a 为国王到 i-1 个人的 左手数的乘积
通过比较max{a/db[i], a*da[i]/db[i+1]} 和max{a/db[i+1],a*da[i+1]/db[i]}判断换与不换
两边都除以a乘以db[i]*db[i+1]得 max{db[i+1],da[i]*db[i]} < max{db[i],da[i+1]*db[i+1]}
因为da[i]*db[i]>db[i],所以 max{db[i],da[i]*db[i]} < da[i+1]*db[i+1]
同理因为 da[i]*db[i]>db[i] 所以 原式为 da[i]*db[i]<da[i+1]*db[i+1]
即这样排能使结果最优
代码:
#include <bits/stdc++.h>
using namespace std;
int n;
int ds[50000] = {}, dr[50000] = {};
struct Data
{
int da;
int db;
}t[10005];
int cmp(Data x, Data y)
{
return x.da * x.db < y.da* y.db;
}
int res[20005];
string mb(string a, string b)
{
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
memset(res, 0, sizeof res);
for (int i = 0;i < a.size();i++)
{
for (int j = 0;j < b.size();j++)
{
res[i + j] += (a[i] - '0') * (b[j] - '0');
}
}
for (int i = 0;i < a.size() + b.size();i++)
{
if (res[i] >= 10)
{
res[i + 1] += res[i] / 10;
res[i] %= 10;
}
}
string str;
bool fi = true;
for (int i = a.size() + b.size() - 1;i >= 0;i--)
{
if (res[i] == 0 && fi==true)
continue;
else
{
fi = false;
str += res[i] + '0';
}
}
return str;
}
string ma(string a, string b)
{
if (a.size() != b.size())
return a.size() > b.size() ? a : b;
return a > b ? a : b;
}
string dst(string da, int db)
{
memset(ds, 0, sizeof(ds));
memset(dr, 0, sizeof(dr));
for (int i = 0;i < da.size();i++)
ds[i + 1] = da[i] - '0';
int bs = 0;
for (int i = 1;i <= da.size();i++)
{
dr[i] = (bs * 10 + ds[i]) / db;
bs = (bs * 10 + ds[i]) % db;
}
int lc = 1;
while (dr[lc] == 0 && lc < da.size())
lc++;
string dans = "";
for (int i = lc;i <= da.size();i++)
dans += dr[i] + '0';
return dans;
}
string tstr(int qs)
{
string p_ans = "";
while (qs)
{
p_ans += qs % 10 + '0';
qs /= 10;
}
reverse(p_ans.begin(), p_ans.end());
return p_ans;
}
int main()
{
cin >> n;
for (int i = 0;i <= n;i++)
cin >> t[i].da >> t[i].db;
sort(t + 1, t + n + 1, cmp);
string ans = "0", mul = tstr(t[0].da);
for (int i = 1;i <= n;i++)
{
ans = ma(ans, dst(mul, t[i].db));
mul = mb(mul, tstr(t[i].da));
}
cout << ans << endl;
return 0;
}