第一题:
7-1 打字
分数 20
全屏浏览题目
切换布局
作者 neuqAcmClub
单位 东北大学秦皇岛分校
如果你仍然再用二指禅打字,那我建议你重新学习打字,这样你打字会更快,感觉更舒适和愉快。
有很多网站教授正确的打字。下图描述了基本原理: 用同一手指按压颜色相同的键。黄色键需要用小指按压,蓝色的用无名指,绿色的用中指,红色的用食指。
另外,左手按键盘的左侧(从左侧的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
输入样例2:
PRINT'NY'[NASLA]
输出样例2:
2 1 0 2 4 1 1 5
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
思路:模拟问题
if—else if判断情况,并用数组保存次数
AC代码:
#include<bits/stdc++.h> using namespace std; int main() { int ans[8]={0}; string str;string str2="'''"; cin>>str; for(int i=0;i<str.size();i++) { char x=str[i]; if(x=='`'||x=='1'||x=='Q'||x=='A'||x=='Z') { ans[0]++;continue;} else if(x=='2'||x=='W'||x=='S'||x=='X') { ans[1]++;continue;} else if(x=='3'||x=='E'||x=='D'||x=='C') { ans[2]++;continue;} else if(x=='4'||x=='R'||x=='F'||x=='V') { ans[3]++;continue;} else if(x=='5'||x=='T'||x=='G'||x=='B') { ans[3]++;continue;} else if(x=='6'||x=='Y'||x=='H'||x=='N') { ans[4]++;continue;} else if(x=='7'||x=='U'||x=='J'||x=='M') { ans[4]++;continue;} else if(x=='8'||x=='I'||x=='K'||x==',') { ans[5]++;continue;} else if(x=='9'||x=='O'||x=='L'||x=='.') { ans[6]++;continue;} else if(x=='0'||x=='P'||x==';'||x=='/'||x=='='||x=='-'||x=='['||x==']'||x==str2[1]) { ans[7]++;continue;} } for(int i=0;i<8;i++) cout<<ans[i]<<endl; }
第二题切香肠
7-2 分香肠
有题解
分数 20
全屏浏览题目
切换布局
作者 neuqAcmClub
单位 东北大学秦皇岛分校
有 N 根完全相同的香肠, 现在要平均分给 M 个客人。 问最少需要切几刀才能将其平均分给客人(不能多个香肠一起切)。
输入格式:
两个整数 N(1≤N≤105) 和 M(1≤M≤105)
输出格式:
一个整数,表示要切的刀数
输入样例:
在这里给出一组输入。例如:
2 6
输出样例:
在这里给出相应的输出。例如:
4
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
思路:
可以看出,以下切割策略是最佳的。
将香肠排列成一条直线从而获得由N个较短线段组成的线。将这条线切割成M个相等的线段可以得到所需的解。虽然我们在概念上做的是M-1切,
但其中一些不是真正的切,而是落在香肠之间(较短的线段)。
因此可以简单地使用for循环来检查,对于对于每一次切割,它是真切割还是原本中间就是分开的。
另外,有一个明确的公式:解=M-gcd(N,M) (gcd即最大公约数)
gcd(N,M)其实上就是虚拟切的数目
减去就得到了最少切的次数
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
int main()
{
cin>>n>>m;
int temp;
temp=m-__gcd(n,m) ;
cout<<temp;
}
第三题会议安排:
7-3 h0145. 会议安排
分数 20
全屏浏览题目
切换布局
作者 黄正鹏
单位 贵州工程应用技术学院
学校的礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。小刘的工作就是安排学校礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排。
输入格式:
第一行是一个整型数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
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
思路:
贪心算法,
按开始时间最早排序,在已选时间 内选结束时间最早的,并更新时间。
在一个数轴上有n条线段,现要选取其中k条线段使得这k条线段两两没有重合部分,问最大的k为多少。
最左边的线段放什么最好?
显然放右端点最靠左的线段最好,从左向右放,右端点越小妨碍越少
AC代码:
#include <bits/stdc++.h>
using namespace std;
int m, n;
int ans;
struct acg{
int s, f;
bool operator< (acg b){
return s < b.s;
}
}hd[10005];
int main(){
cin >> m;
for(int i = 0; i < m; i++){
cin >> n;
int t=0;
for(int j = 0; j < n; j++){
cin >> hd[j].s >> hd[j].f;
}
sort(hd, hd+n);
t=hd[0].f;
ans=1;
for(int i = 1; i < n; i++){
if(hd[i].s >= t){
ans++;
t=hd[i].f;
}
else if (hd[i].f < t){
t = hd[i].f;
}
}
cout << ans << endl;
}
}
第四题:
7-4 神秘密码
分数 20
全屏浏览题目
切换布局
作者 neuqAcmClub
单位 东北大学秦皇岛分校
传说二战时X国收到了上帝的一串密码,只有解开密码,才能阻止战争的继续进行,世界才会恢复和平。解开密码的第一道工序就是解压缩密码,上帝对于连续的若干个相同的子串"X"会压缩为"[DX]"的形式(D是一个整数且1<=D<=99),比如说字符串"CBCBCBCB"就压缩为"[4CB]"或者"[2[2CB]]",类似于后面这种压缩之后再压缩的称为二重压缩。如果是"[2[2[2CB]]]"则是三重的。现在我们给你上帝发送的密码,请你对其进行解压缩。
输入格式:
一个字符串。
输出格式:
一个字符串。
输入样例:
在这里给出一组输入。例如:
AC[3FUN]
输出样例:
在这里给出相应的输出。例如:
ACFUNFUNFUN
【数据范围】
解压后的字符串长度在 20000 以内,最多只有十重压缩。保证只包含数字、大写字母、
[
和]
。
才开始一直是思考读取完毕之后先找 '['个数
发现工程量太大
使用递归算法,在读入这个字符串之后,找出被压缩的内容,再对被压缩的那个字符串实行「解压缩」操作。‘
代码:
#include<bits/stdc++.h>
using namespace std;
string read()
{
int n;
string s="",s1;
char c;
while (cin>>c)
{
if (c=='[')
{
cin>>n;
s1=read();
while (n--) s+=s1;
}
else
{
if (c==']') return s;
else s+=c;
}
}
}
int main()
{
cout<<read();
return 0;
}
第五题:
7-5 h0114.国王游戏
有题解
分数 20
全屏浏览题目
切换布局
作者 黄正鹏
单位 贵州工程应用技术学院
恰逢 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
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
思路:
ac代码:
#include <bits/stdc++.h>
using namespace std;
const int Max = 1e5+5;
int n;
int a[Max],b[Max];
int lena, lenb, lenacg;
int acg[1000005];
struct abc{
long long l,r;
bool operator<(abc b){
return l*r<b.l*b.r;
}
}d[1005];
void sheng(long long ber){ //高精度乘
int x = 0;
for(int i = 1; i <= lena; i++){
a[i] = a[i]*ber + x;
x = a[i]/10;
a[i]%=10;
}
while(x){
a[++lena]=x%10;
x/=10;
}
}
void chu(long long ber){ //高精度除
int n = lena;
int now=0;
while(n > 0){
now = now*10 + a[n];
b[n] = now / ber;
now = now % ber;
n--;
}
lenb = lena;
while(b[lenb]==0 && lenb) lenb--;
}
void bijiao1(){
int book = 0;
if(lenacg < lenb) book=1;
if(lenacg == lenb){
for(int i = lenb; i >= 1; i--){
if(b[i]>acg[i]){
book = 1;
break;
}
if(acg[i]>b[i]) break;
}
}
if(book==1){
for(int i = lenb; i >= 1; i--){
acg[i] = b[i];
}
lenacg = lenb;
}
}
int main(){
cin >> n;
cin >> d[0].l >> d[0].r;
for(int i = 1; i <= n; i++){
cin >> d[i].l >> d[i].r;
}
sort(d+1, d+n+1);
int hl = d[0].l;
while(hl){
a[++lena]=hl%10;
hl /= 10;
}
for(int i = 1; i <= n; i++){
chu(d[i].r);
bijiao1();
sheng(d[i].l);
}
for(int i = lenacg; i >= 1; i--){
cout << acg[i];
}
}