• 杭电oj平台上的11页题目代码:hdu-page11 (2060~2069)2060、2061、2062、2063、2064、2065、2066、2068


    //2060
    /*斯诺克的桌球游戏,关键在于对题目的理解

    下面是别的大牛解释的题意

    题意为,给你场上剩下的球数m , 和 a ,b 两名队员目前得分,现在假设a将

    所有的球m都打入洞中,然后让你输出是否最终a的得分会超过b;

    总共有15个红球,和6个有颜色的球,每个红球的得分为1 ,6

    个有颜色的球分别为2 , 3, 4 ,5, 6, 7 ;

    因为 要求最大得分,需要考虑的情况有两种;

    A :当 m > 6时 ,应该将有颜色的球都取了,有色球得分为

    2 + 3 + 4 + 5 + 6 + 7 ,有色球总得分为27 ;然后再取红球 m - 6 ,本

    来得分应该是 ( m - 6 ) * 1 ,但是由于有色球全部打进洞后,每个球需要

    额外增加黑球(最高得分)的得分;所以红球总得分为( m - 6 ) * 1 + ( m

    - 6 ) * 7 ;

    总得分为( m - 6 ) * 8 + 27 ;

    B:当 m <= 6 时 ,应该由价值最高的黑球( 7 分) 向前依

    次增加求和,又因为有色球满足等差数列 ,由前6项减去前 6 - m项和,所以

    求得为( 7 - m + 1 + 7 ) * m / 2 ( 这里直接通过得分来计算的)。因

    此,第二种情况的得分为( 15 - m ) *m/ 2 ;*/
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<algorithm>
    using namespace std;
    int main()
    {
    int n;
    int m, a, b;
    scanf("%d", &n);
    while (n--)
    {
    scanf("%d%d%d", &m, &a, &b);
    if (m > 6)
    {
    a = a + (m - 6) * 8 + 27;
    }
    else
    {
    a = a + (15 - m)*m / 2;
    }
    if (a>=b)
    {
    printf("Yes ");
    }
    else
    {
    printf("No ");
    }
    }
    return 0;
    }

    //2061
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<algorithm>
    #define MAXN_LEN 31
    char course_name[MAXN_LEN];
    int main()
    {
    int n;
    int k;
    double credit;
    double score;
    double gpa;
    int count = 0;
    int flag;//用来标记是不是有一门课小于60分
    scanf("%d", &n);
    double sum1, credit_sum;
    while (n--)
    {
    gpa = 0;
    sum1 = 0;
    credit_sum = 0;
    flag = 0;
    scanf("%d", &k);
    for (int i = 0; i < k; i++)
    {
    scanf("%s%lf%lf", course_name, &credit, &score);
    if (score>=0&&score<60)
    {
    flag = 1;
    //break;这里加了break就错了,因为break了以后的就scanf不进去了,就跳出循环了
    }
    else
    {
    sum1 += credit*score;
    credit_sum += credit;
    }
    }
    gpa = sum1*1.0 / credit_sum;
    if (flag==0)
    {
    printf("%.2lf ", gpa);
    }
    else
    {
    printf("Sorry! ");
    }
    if (n!=0)
    {
    printf(" ");
    }
    }
    return 0;
    }

    //2063
    //匈牙利算法http://blog.csdn.net/dark_scope/article/details/8880547
    /*思路:
    *Rabbit只愿意和XHD或PQK做partner,
    *Grass只愿意和linle或LL做partner,
    *PrincessSnow愿意和水域浪子或伪酷儿做partner;
    boss让找到partner的人去坐过山车,输出可以坐上过山车的最多组合数
    */
    #include<stdio.h>
    #include<string.h>
    int line[510][510], boy[510], used[510];
    int n, m;
    int Find(int x)
    {
    int i, j;
    for (i = 1; i <= m; i++)//遍历所有被选者
    {
    if (line[x][i] == 1 && used[i] == 0)
    {//如果 x对i有好感且在这一个递归选取阶段没有被选取(哪怕是暂时选取,新的递归可能会换)
    used[i] = 1;//标记被选取
    if (boy[i] == 0 || Find(boy[i]))//如果被选者没有归属或他的归属着可以调换(他的归属者可以选择其它被选者)
    {
    boy[i] = x;//将归属定为 x
    return 1;
    }
    }
    }
    return 0;
    }
    int main()
    {
    int i, j, k, x, y, sum;
    while (scanf("%d %d %d", &k, &n, &m), k != 0)
    {
    memset(line, 0, sizeof(line));
    memset(boy, 0, sizeof(boy));
    memset(used, 0, sizeof(used));
    for (i = 0; i<k; i++)
    {
    scanf("%d %d", &x, &y);
    line[x][y] = 1;//表示 x希望与 y有关系
    }
    sum = 0;//记录能撮合的情侣对数
    for (i = 1; i <= n; i++)
    {
    memset(used, 0, sizeof(used));//每次都要清 0
    if (Find(i)) sum++;//找到一对就记录
    }
    printf("%d ", sum);
    }
    return 0;
    }


    //2064
    /*思路:假设将n层塔从A经B挪到C需要f[n]步。
    那么具体的移动过程可以这样看:将上面n-1层从A经B挪到C需要f[n-1]步,
    再将第n层从A挪到B,需要一步,
    再将上n-1层从C经B挪到A,需要f[n-1]步,
    再将第n层从B挪到C,需要一步,
    再将上n-1层从A经B挪到C,需要f[n-1]步,总计3*f[n-1] + 2步,其中 f[1] = 2;*/
    #include<stdio.h>
    typedef long long ll;
    #define N 36
    ll dp[N];
    int main()
    {
    int n;
    dp[0] = 0;
    dp[1] = 2;
    for (int i = 2; i < N; i++)
    {
    dp[i] = 3 * dp[i - 1] + 2;
    }
    while (~scanf("%d", &n))
    {
    printf("%lld ", dp[n]);
    }
    return 0;
    }

    //2065
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    //快速幂Fast Exponentiation
    int haha(int a, _int64 b)
    {
    int sum = 1;
    while (b)
    {
    //如果b是奇数,b%2==1
    if (b&1)
    {
    sum = (sum*a) % 100;
    }
    a = (a*a) % 100;
    b = b >> 1;
    }
    return sum;
    }

    int main()
    {
    int T;
    int i;
    int temp;
    _int64 n;
    while (~scanf("%d",&T))
    {
    if (T==0)
    {
    break;
    }
    for ( i = 1; i <= T; i++)
    {
    scanf("%I64d", &n);
    temp = (haha(2, n - 1) + haha(4, n - 1)) % 100;
    printf("Case %d: %d ", i,temp);
    }
    printf(" ");
    }
    return 0;
    }

    //2068
    /*思路:将编号为1的元素放在第2到第n个位置之上,有n-1种方法,错排余下的n-1个元素。类推,将编号为1到将共k个元素的话,就有n-k种方法;
    选k个人错排。*/
    #include<stdio.h>
    #include<math.h>
    typedef long long ll;
    ll d[14] = { 0, 0, 1, 2 };
    //错排公式
    void init()
    {
    for (int i = 4; i < 14; i++)
    {
    d[i] = (i - 1)*(d[i - 1] + d[i - 2]);
    }
    }

    //求组合数
    ll C_n_m(int n, int m)
    {
    if (m==0)
    {
    return 1;
    }
    ll up = 1;
    ll down = 1;
    for (int i = n; i >= (n-m+1); i--)
    {
    up *= i;
    }
    for (int i = 1; i <= m; i++)
    {
    down *= i;
    }
    return up / down;
    }

    int main()
    {
    int n;
    init();
    while (~scanf("%d",&n))
    {
    if (n==0)
    {
    break;
    }
    ll ans = 1;
    //从n个人中去i个人错排
    for (int i = 0; i <= n/2; i++)
    {
    ans += C_n_m(n, i)*d[i];
    }
    printf("%lld ", ans);
    }
    return 0;
    }

    一生有所追!
  • 相关阅读:
    调试导论
    CSP-S2 2020 游记
    【题解】51nod 1327 棋盘游戏
    基础数学专题复习
    ubuntu 下 zsh 插件及安装方式
    ubuntu 下 Deepin-TIM 折腾笔记
    微服务学习笔记
    使用 Portainer 管理 Docker 笔记(含本地和远程)
    博客收藏
    定制unittest测试报告【转】
  • 原文地址:https://www.cnblogs.com/BlueBlue-Sky/p/8604552.html
Copyright © 2020-2023  润新知