zoukankan      html  css  js  c++  java
  • 《程序设计语言综合设计》第一周上机练习

    4 兼容任务

    设有n个任务,其中每个任务有一个起始时间si和一个结束时间ei,且si<ei,同一时间只能完成一个任务。如果选择了任务i ,则它在时间区间 [si ,ei) 内占用资源。若区间 [si ,ei) 与区间 [sj, ej)不相交,则称任务 i 与任务 j 是相容的。那么,对于给定的任务时间区间,能互相兼容的最大任务个数是多少呢?

    输入格式

    第一行一个整数n (1<=n<=1000) ;
    接下来n行,每行两个整数si 和 ei。

    输出格式

    互相兼容的最大任务个数。

    输入样例

    4
    1 3
    4 6
    2 5
    1 7

    输出样例

    2

    Accepted

    #include <cstring>
    #include<algorithm>
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <stdio.h>
    #include <string.h>
    using namespace std;
        struct range{
            int l;
            int r;
        }a[1000];
    bool cmp(range a,range b){
        return a.r<b.r;
    }
            int main(){
                int n,num=1,i;
                int t;
                scanf("%d",&n);
                for(i=0;i<n;i++){
                    scanf("%d %d",&a[i].l,&a[i].r);
                }
                sort(a,a+n,cmp);
                t=a[0].r;
              for(i=1;i<n;i++){
                  if(a[i].l>=t){
                      num++;
                      t=a[i].r;
                  }
                }
                printf("%d
    ",num);
                return 0;
            }
    

    5 致死一击

    Kunkun最近热爱rpg闯关游戏,经常带着他的舍友打各种boss。但是随着舍友装备的逐渐升级,kunkun发现他给予boss最后一击的机会越来越少(给boss最后一击的玩家稀有装备爆率会大幅度提升)。所以kunkun联系到了一个神秘人,他可以利用时停来让boss躲过舍友的攻击,每次时停只能躲避一次攻击。 假设kunkun和他的舍友都采取轮流攻击战术(kunkun率先攻击,kunkun的攻击力为a;舍友的攻击力为b,玩家每次都只进行一次攻击)去刷n个boss。如果最多只能使用k次时停,那么kunkun能造成致死伤害的boss最多有几个?

    输入格式

    输入共两行。
    第一行包括4个正整数 n,a,b,k (1≤n≤2*1e5, 1≤a,b,k≤1e9),n表示boss的数量,a为kunkun的攻击力,b为kunkun舍友的攻击力,k为时停的最大次数。
    第二行输入n个正整数h1,h2,…,hn (1≤hi≤1e9),表示每个boss的血量。

    输出格式

    输出一个整数,即kunkun造成致死伤害的boss的最大个数。

    输入样例1

    6 2 3 3
    7 10 50 12 1 8

    输出样例1

    5

    输入样例2

    6 2 3 3
    7 10 50 12 1 8

    输出样例2

    5

    输入示例3

    7 4 2 1
    1 3 5 4 2 7 6

    输出示例3

    6

    这题题意有一个很重要的一点就是,每只怪都是独立的,也就是说,当每一只怪死后,下一只怪先手依然是kunkun,所以,我们可以通过分别算出杀死一只怪需要多少次时停,然后再从小到大进行排序,最终得出结果。

    Accepted

    #include <cstring>
    #include<algorithm>
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <stdio.h>
    #include <string.h>
    using namespace std;
            int main(){
                int n,a,b,k,i,j;
                int h;
                int num=0;
                int count[1000000]={0};
                scanf("%d %d %d %d",&n,&a,&b,&k);//n表示boss的数量,a为kunkun的攻击力,b为kunkun舍友的攻击力,k为时停的最大次数。
                for(i=1;i<=n;i++){
                    scanf("%d",&h);
                    while(1){
                        h-=a;
                        if(h<=0) break;
                        h-=b;
                        if(h<=0) {
                            h+=b;
                            count[i]++;
                        }
                    }
                }
                sort(count+1,count+1+n);
                for(i=1,j=0;i<=n;i++){
                    j+=count[i];
                    if(j>k) break;
                    num++;
                }
                printf("%d
    ",num);
                return 0;
            }
    
    #include <cstring>
    #include<algorithm>
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <stdio.h>
    #include <string.h>
    using namespace std;
            int main(){
                int n,a,b,k,i,j;
                int h;
                int num=0;
                int count[100000]={0};
                scanf("%d %d %d %d",&n,&a,&b,&k);//n表示boss的数量,a为kunkun的攻击力,b为kunkun舍友的攻击力,k为时停的最大次数。
                for(i=1;i<=n;i++){
                    scanf("%d",&h);
                    h%=(a+b);//注意这里
                    if(h==0) h+=(a+b);//注意这里
                    while(1){
                        h-=a;
                        if(h<=0) break;
                        h-=b;
                        if(h<=0) {
                            h+=b;
                            count[i]++;
                        }
                    }
                }
                sort(count+1,count+1+n);
                for(i=1,j=0;i<=n;i++){
                    j+=count[i];
                    if(j>k) break;
                    num++;
                }
                printf("%d
    ",num);
                return 0;
            }
           
    

    7 德州扑克

    最近,阿夸迷于德州扑克。所以她找到了很多人和她一起玩。由于人数众多,阿夸必须更改游戏规则:

    1. 所有扑克牌均只看数字,不计花色。
    2. 每张卡的值为1、2、3、4、5、6、7、8、9、10、11、12、13 中的一种(对应A,2、3、4、5、6、7, 8、9、10,J,Q,K)
    3. 每位玩家从一副完整的扑克牌(没有大小王)中抽出五张扑克牌,可能出现的手牌的值从低到高排列如下:
    • 高牌:不包含以下牌的牌。对于都是高牌的牌,按照五张牌的值的和进行从大到小排序。
    • 对子:手中的5张牌中有2张相同值的牌。对于都拥有对子的牌,按构成该对子的牌的值进行从大到小地排序。如果这些都相同,则按手牌中余下3张牌的值的和进行从大到小排序。
    • 两对:手中拥有两对不同的对子。对于都包含两对的手牌,按其最高对子的值进行从大到小排序。如果最高对子相同,则按另一个对子的值从大到小地进行排序。如果这些值相同,则按剩余牌的值从大到小地进行排序。
    • 三条:手中拥有3张相同值的牌。对于都包含三条的手牌按构成三条的牌的值进行从大到小地排序。如果这些值相同,则按剩余牌的值从大到小地进行排序。
    • 满堂红:手中拥有一个三条和一个对子。同理,先按三条大小排序,如果三条大小相同,则按对子大小进行排序。
    • 四条:手中拥有4张相同值的牌。对于都包含四条的手牌按构成四条的牌的值进行从大到小地排序。如果这些值相同,则按剩余牌的值从大到小地进行排序。
    • 顺子:手中拥有5张连续值的卡。对于都包含顺子的手牌按顺子最大的牌进行排序。
    • 皇家同花顺:手中拥有10到A(10、J、Q、K、A)。是最大的手牌!
      现在,阿夸已经知道了每个人的手牌,她想要知道所有人的排名列表。如果玩家的手牌大小相等,则按玩家名字的字典序输出。保证没有重复的名字。你能帮帮她吗?

    输入格式

    第一行包含一个正整数 N (1<=N<=100000) ,表示玩家的人数。
    接下来 N 行,每行包含两个字符串:m (1<=|m|<=10 ) ,表示玩家的名字;s (1<=|s|<=10),表示玩家的手牌。

    输出格式

    输出 N个玩家的排名列表。

    输入样例

    3
    Alice AAA109
    Bob 678910
    Boa 678910

    输出样例:

    Boa
    Bob
    Alice

    Accepted

    #include <cstring>
    #include<algorithm>
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    //level代表优先级 level1 > level2 > level3 > level4
    using namespace std;
    struct player{
        string name;
        int level1=0;
        int level2=0;
        int level3=0;
        int level4=0;
    }p[100005];
    int change[100];//每张牌出现的次数
    int poker[100];//每张牌对应的数值
    int sum;
    void judge(int a){ // a表示第几个玩家
        int i,j;
        int flag=0;
        sort(poker+1,poker+6);//把五张手牌大小从小到大排序
        //皇家同花顺
        if(change[1]==1&&change[10]==1&&change[11]==1&&change[12]==1&&change[13]==1){
            p[a].level1=8;
            return ;
        }
        
        //顺子
        for(i=2;i<=5;i++){
            if(poker[i]!=poker[i-1]+1) {
                flag=1;
                break;}
        }
        if(flag==0) {
            p[a].level1=7;
            p[a].level2=poker[5];
            return ;
        }
        
        //四条
        for(i=1;i<=2;i++){
            if(poker[i]==poker[i+3]){
                p[a].level1=6;
                p[a].level2=poker[i];
                p[a].level3=sum-4*poker[i];
                return ;
            }
        }
        
        //满堂红
       if(poker[1]==poker[2]&&poker[3]==poker[5]){
           p[a].level1=5;
           p[a].level2=poker[3];
           p[a].level3=poker[1];
           return ;
       }
        if(poker[1]==poker[3]&&poker[4]==poker[5]){
            p[a].level1=5;
            p[a].level2=poker[1];
            p[a].level3=poker[4];
            return ;
        }
        
        //三条
        for(i=1;i<=3;i++){
            if(poker[i]==poker[i+2]){
                for(j=1;j<=5;j++)
                    if(poker[j]!=poker[i])
                    {
                        p[a].level1=4;
                        p[a].level2=poker[i];
                        p[a].level3=sum-3*poker[i];
                        return ;
                    }
            }
        }
        
        //两对
        for(i=1;i<=13;i++){
            if(change[i]==2){
                for(j=1;j<=13;j++){
                    if(change[j]==2 && i!=j){
                        p[a].level1=3;
                        if(i>j){
                            a[p].level2=i;
                            a[p].level3=j;
                        }
                        else{
                            a[p].level2=j;
                            a[p].level3=i;
                        }
                        a[p].level4=sum-2*i-2*j;
                        return;
                    }
                }
                    
                    //对子
                    p[a].level1=2;
                     p[a].level2=i;
                     p[a].level3=sum-2*i;
                    return ;
                }
            }
            
        //高牌
            p[a].level1=1;
            p[a].level2=sum;
            return ;
    }
    bool cmp(player a,player b){
        if(a.level1!= b.level1) return a.level1 > b.level1;
        if(a.level2!= b.level2) return a.level2 > b.level2;
        if(a.level3!= b.level3) return a.level3 > b.level3;
        if(a.level4!= b.level4) return a.level4 > b.level4;
        else return a.name < b.name;
    }
            int main(){
                int n;
                int i,j;
                char ch; //读入的每张牌;
                cin >> n;
                for(i=1;i<=n;i++){
                   memset(change,0,sizeof(change)); //每次输入玩家的手牌前,h出现次数清零
                    cin >> p[i].name;
                    getchar();
                    for(j=1;j<=5;j++){
                        cin >> ch;
                        if(ch=='A') {
                            poker[j]=1;
                            change[1]++;
                        }
                        else if(ch=='J') {
                            poker[j]=11;
                            change[11]++;
                        }
                        else if(ch=='Q') {
                            poker[j]=12;
                            change[12]++;
                        }
                        else if(ch=='K') {
                            poker[j]=13;
                            change[13]++;
                        }
                        else if(ch=='1') {//手牌为10
                            change[10]++;
                            poker[j]=10;
                            cin >> ch;
                        }
                        else {
                            poker[j]=ch-'0';
                            change[poker[j]]++;}
                    }
                    sum=0;
                    for(j=1;j<=5;j++){
                        sum+=poker[j];
                    }
                    judge(i);
                }
                sort(p+1,p+1+n,cmp);
                for(i=1;i<=n;i++){
                    cout << p[i].name << endl;
                }
                return 0;
            }
    
  • 相关阅读:
    Android OpenGL 编写简单滤镜
    linux 文件系统
    此博客不再更新
    golang sync包
    KADEMLIA算法
    golang 类型转换
    golang 小例子
    go-ehtereum编译:
    golang编译库文件方式
    以太坊(Ethereum)智能合约NodeJS/Web3 使用
  • 原文地址:https://www.cnblogs.com/lvhang/p/12346258.html
Copyright © 2011-2022 走看看