zoukankan      html  css  js  c++  java
  • 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
    5 5

    输出样例:

    在这里给出相应的输出。例如:

    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;
        return 0;
    }
    有人问我,为啥没有输入,直接输出,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;
            }
        }
        return 0;
    } 

    7-10 打败迪奥 (25 分)

    恶人的救世主迪奥又复活了,无敌的承太郎开始召集替身使者们,组队打败邪恶的迪奥,现在有n(1<=n<=2e5)个替身使者,他们每个人的能力是qi(1<=q[i]<=1e9),为了打败迪奥,承太郎需要选择能相差绝对值不超过5的团队,这样才能更好的协同合作,在由无敌的白金之星带领这个团队获得胜利。你能帮承太郎选择出最多人手的团队吗?(学出团队中任意两个人的能力值相差不超过5)

    输入格式:

    t组测试样例,每个测试样例第一行为一个n,下一行为n个数。

    输出格式:

    对于每个测试样例输出最大的团队人数,每个答案占一行。

    输入样例:

    在这里给出一组输入。例如:

    3
    6
    1 2 3 4 5 6
    7
    2 2 2 2 2 2 2
    5
    1 10 20 30 40

    输出样例:

    在这里给出相应的输出。例如:

    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;
        }
        
        return 0;
    } 

     7-11 Keven裂了 (20 分)

     众所周知,Keven最喜欢说的一句话是

    然后大家开始了愉快的做题之旅。

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

    输入格式:

    第一行是空格分隔的两个整数 , ,表示有 n 个题目和 m 分钟。1

    第二行有 n 个非负整数,,表示 Keven 做出第 i 个题目所需要的时间(单位:分钟)

    输出格式:

    输出一行一个整数表示Keven能做出的做多的题目数量

    输入样例:

    在这里给出一组输入。例如:

    5 2
    2 3 0 1 1

    输出样例:

    在这里给出相应的输出。例如:

     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;
                return 0;
            }
            else if(sum == m){
                cout<<i+1<<endl;
                return 0;
            }
        }
        cout<<n<<endl;
        
        return 0 ;
    }
  • 相关阅读:
    继承与钻石继承
    面向对象----对象的组合和
    认知类和对象的关系
    初识面向对象----类和对象的关系
    其他题目
    三级菜单
    用户登陆
    购物车题目
    函数练习题目
    类加载的过程
  • 原文地址:https://www.cnblogs.com/Li-ningning/p/14595845.html
Copyright © 2011-2022 走看看