2021年3月30天梯赛训练部分试题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2021年3⽉30天梯赛训练部分试题
7-8 取取取数 (20 分)
这天,Keven突然想和zwg玩⼀个游戏,游戏规则如下,有N个数字排成⼀列(保证N为偶数),Keven和zwg每次可以从数列的最左边或者最右边取⼀个数字,直到所有数字取完,最后谁的数字和最⼤谁就获胜。

Keven先⼿。

输⼊格式:
输⼊在⼀⾏中给出⼀个正整数N(保证N为正偶数并且N<1000)。

第⼆⾏给出N个绝对值⼩于1e10的正整数
输出格式:
如果Keven赢了或者平局就输出Keven tql!,如果Keven输了就输出zwg tql!。

输⼊样例:
在这⾥给出⼀组输⼊。

例如:
2
55
输出样例:
在这⾥给出相应的输出。

例如:
Keven tql!
思路:先⼿总是挑最⼤的数,或露出最⼩的数给对⼿
例如:5 6 3 3 6 5
第⼀轮:先⼿:5 ,后⼿取 6(后⼿可取5和6 ,这⾥假设取6)
第⼆轮:先⼿:3 ,后⼿取5
第三轮:先⼿取6 ,后⼿取3 (⼜⼀样了)
怎么取都是先⼿赢或平局
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"Keven tql!"<<endl;
return0;
}
有⼈问我,为啥没有输⼊,直接输出,OJ系统⿊盒测试,只要结果
7-9 ⼩江的密码 (15 分)
⼩江是⼀名哔哩哔哩⽹站控,因此他注册了⽆数的账号,但是账号的名字并不⼀定不相同。

近期,他想知道某⼀个账号的名字。

因为他已经改名字改到了吐⾎,他将会给你他的改名字的记录,希望你可以帮他查找出某⼀个账号现在的名字。

输⼊格式:
第⼀⾏⼀个整数n,代表修改信息的条数。

(1<=n<=20000)
第⼆⾏到第n + 1⾏,每⾏两字符串a、b,a为名字,b为账号 ( 1 <= |a| ,|b|<= 20 , |s| 代表字符串s 的长度的意思 )
接下来⼀⾏⼀个数字m,为查询次数。

(1<=m<=40000)
接下来m⾏,每⾏⼀个账号数据。

注:账号为⼀串数字组成,名字由数字,字母组成。

输出格式:
m⾏数据,代表每⼀个查询。

输出格式:"caseA:B",。

A为序号,从0开始。

当答案存在时,b为答案,查询为空时,b为:"no ID!"(⽆引号)
输⼊样例:
3
jxb 897956
ydb 086362
jdb 897956
2
897956
123
输出样例:
case0:jdb
case1:no ID!
思路:没什么思路吧,直接上map
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n ;
cin>>n;
map<string,string> m;
string name ,id;
while(n--){
cin>>name>>id;
m[id] = name ;
}
cin>>n;
for(int i = 0 ; i < n ; i++){
map<string,string>::iterator it;
cin>>id;
it = m.find(id);
if(it != m.end()){
cout<<"case"<<i<<":"<<m[id]<<endl;
}
else {
cout<<"case"<<i<<":no ID!"<<endl;
}
}
return0;
}
7-10 打败迪奥 (25 分)
恶⼈的救世主迪奥⼜复活了,⽆敌的承太郎开始召集替⾝使者们,组队打败邪恶的迪奥,现在有n(1<=n<=2e5)个替⾝使者,他们每个⼈的能⼒是q(1<=q[i]<=1e9),为了打败迪奥,承太郎需要选择能相差绝对值不超过5的团队,这样才能更好的协同合作,在由⽆敌的⽩⾦之星带领这个团队获得胜利。

你能帮承太郎选择出最多⼈⼿的团队吗?(学出团队中任意两个⼈的能⼒值相差不超过5)
输⼊格式:
t组测试样例,每个测试样例第⼀⾏为⼀个n,下⼀⾏为n个数。

输出格式:
对于每个测试样例输出最⼤的团队⼈数,每个答案占⼀⾏。

输⼊样例:
在这⾥给出⼀组输⼊。

例如:
3
6
123456
7
2222222
5
110203040
输出样例:
在这⾥给出相应的输出。

例如:
6
7
1
思路:这个是线性DP⼊门吧,我⽤了⼀个双指针暴⼒过了,本想写O(nlogn)的复杂度的,但是实际测试的时候好像退化成O(n^2)了,#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int a ;
cin>>a;
while(a--){
int n ;
vector<int> vec;
cin>>n;
int temp;
for(int i = 0 ; i < n ; i ++){
cin>>temp;
vec.push_back(temp);
}
sort(vec.begin() , vec.end() ) ; // 要排序
int p = 0 ;
int mark = vec[0];
int sum = 0 ;
int Max = -111;
for(int i = 0; i < n ; i++){
while(vec[i] - mark > 5){ // 控制能⼒差值,超出范围了,就把前⾯的踢掉
p++;
sum--;
mark = vec[p];
}
sum++;
Max = max(Max , sum);
}
cout<<Max<<endl;
}
return0;
}
7-11 Keven裂了 (20 分)
众所周知,Keven最喜欢说的⼀句话是
然后⼤家开始了愉快的做题之旅。

已知有 n 个题⽬, m分钟,做完每个题⽬所花费的时间是不⼀样的,求 Keven 最多可以做出多少个题⽬。

输⼊格式:
第⼀⾏是空格分隔的两个整数 , ,表⽰有 n 个题⽬和 m 分钟。

1
第⼆⾏有 n 个⾮负整数,,表⽰ Keven 做出第 i 个题⽬所需要的时间(单位:分钟)
输出格式:
输出⼀⾏⼀个整数表⽰Keven能做出的做多的题⽬数量
输⼊样例:
在这⾥给出⼀组输⼊。

例如:
52
23011
输出样例:
在这⾥给出相应的输出。

例如:
3
思路:简单贪⼼,排序⼀下就⾏了,刚开始还犹豫了是不是背包
#include<bits/stdc++.h>
using namespace std ;
int main(){
int n , m ;
cin>>n>>m ;
vector<int> vec;
int temp ;
for(int i = 0 ; i < n ; i++){
cin>>temp;
vec.push_back(temp);
}
sort(vec.begin() , vec.end()) ;
int sum = 0 ;
for(int i = 0 ; i < n ; i++){
sum += vec[i];
if(sum > m){
cout<<i<<endl;
return0;
}
else if(sum == m){ cout<<i+1<<endl;
return0;
}
}
cout<<n<<endl; return0 ;
}。

相关文档
最新文档