zoukankan      html  css  js  c++  java
  • 清北10.6

    1.

    (flower.cpp/c/pas)

    【问题描述】

    商店里出售n种不同品种的花。为了装饰桌面,你打算买m支花回家。你觉得放两支一样的花很难看,因此每种品种的花最多买1支。求总共有几种不同的买花的方案?答案可能很大,输出答案mod p的值。

    【输入格式】

    一行3个整数n,m,p,意义如题所述。

    【输出格式】

    一个整数,表示买花的方案数。

    【输入输出样例1】

    flower.in

    flower.out

    4 2 5

    1

             见选手目录下的flower / flower1.in与flower / flower1.out

     

    【输入输出样例1说明】

        用数字1,2,3,4来表示花的种类的话,4种花里买各不b相同的2支的方案有(1,2)、(1,3)、(1,4)、(2,3)、(2,4)、(3,4),共6种方案,模5后余数是1。

    【输入输出样例2】

             见选手目录下的flower / flower2.in与flower / flower2.out

    【数据范围】

    对于30%的数据,n,m≤10

    对于50%的数据,n,m≤1000

    对于80%的数据,1≤m≤n≤50,000

    对于100%的数据,1≤m≤n≤1,000,000,p≤1,000,000,000

     

     

    #include <cstdio>
    #include <cmath>
    #define N 1000100
    int num[N],n,m,i,j,d[N];
    long long p,ans;
    bool f[N];
    int main()
    {
        scanf("%d%d%lld",&n,&m,&p);
        for (i=m+1;i<=n;i++) num[i]=1;
        for (i=1;i<=n-m;i++) num[i]-=1;
        for (i=2;i<=n;i++)
          if (!f[i])
            {
               for (j=i+i;j<=n;j+=i)
                 {
                   f[j]=1;
                   d[j]=i;
                 }
            }
        for (i=n;i>=2;i--)
        if (d[i]>0)
          {
            num[d[i]]+=num[i];
            num[i/d[i]]+=num[i];
            num[i]=0;
          }
        ans=1;
        for (i=2;i<=n;i++)
        for (j=1;j<=num[i];j++) ans=ans*i%p;
        printf("%lld
    ",ans);
        return 0;
    }
    View Code

     

    2.圆桌游戏

    (game.cpp/c/pas)

    【问题描述】

             有一种圆桌游戏是这样进行的:n个人围着圆桌坐成一圈,按顺时针顺序依次标号为1号至n号。对1<i<n的i来说,i号的左边是i+1号,右边是i-1号。1号的右边是n号,n号的左边是1号。每一轮游戏时,主持人指定一个还坐在桌边的人(假设是i号),让他向坐在他左边的人(假设是j号)发起挑战,如果挑战成功,那么j离开圆桌,如果挑战失败,那么i离开圆桌。当圆桌边只剩下一个人时,这个人就是最终的胜利者。

             事实上,胜利者的归属是与主持人的选择息息相关的。现在,你来担任圆桌游戏的主持人,并且你已经事先知道了对于任意两个人i号和j号,如果i向j发起挑战,结果是成功还是失败。现在你想知道,如果你可以随意指定每轮发起挑战的人,哪些人可以成为最终的胜利者?

    【输入】

             第一行包含一个整数n,表示参加游戏的人数;

             接下来n行,每行包含n个数,每个数都是0或1中的一个,若第i行第j个数是1,表示i向j发起挑战的结果是成功,否则表示挑战结果是失败。第i行第i列的值一定为0。

     

    【输出】

             一行,包含若干个数,表示可能成为最终胜利者的玩家的标号。标号按从小到大的顺序输出,相邻两个数间用1个空格隔开。

     

    【输入输出样例1】

    game.in

    game.out

    3

    0 1 0

    0 0 1

    0 1 0

    1 3

             见选手目录下的game / game1.in与game / game1.out

     

    【输入输出样例1说明】

             先指定2号向3号发起挑战,3号离开;再指定1号向2号发起挑战,2号离开。此时1号是最终胜利者。

             先指定1号向2号发起挑战,2号离开;再指定1号向3号发起挑战,1号离开。此时3号是最终胜利者。

             无论如何安排挑战顺序,2号都无法成为最终胜利者。

     

    【输入输出样例2】

             见选手目录下的game / game2.in与game / game2.out

     

    【数据规模与约定】

    对于30%的数据,n≤7

    对于100%的数据,n≤100

     

     

    #include <cstdio>
    #include<iostream>
    #define N 205
    using namespace std;
    int n,i,j,k,a[N][N],q[N];
    bool f[N][N],ff;
    int main()
    {
        scanf("%d",&n);
        for (i=1;i<=n;i++)
          for (j=1;j<=n;j++) 
            scanf("%d",&a[i][j]);    
        for (i=1;i<=n;i++) 
          q[i]=q[i+n]=i;
        for (i=1;i<n+n;i++) 
          f[i][i+1]=1;
        for (i=n+n-2;i>=1;i--)
          for (j=i+2;j<=n+n;j++)
            for (k=i+1;k<j;k++)
        if (f[i][k]&&f[k][j]&&(a[q[i]][q[k]]||!a[q[k]][q[j]]))
          {
            f[i][j]=1;
            break;
          }
        for (i=1;i<=n;i++)
        if (f[i][i+n])
          {
            if (ff) printf(" ");
            printf("%d",i);
            ff=1;
           }
        printf("
    ");
        return 0;
    }
    View Code

     

    3.兔子

    (rabbit.cpp/c/pas)

    【问题描述】

    在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝。更特殊地是,至多只有一个兔子窝有3条或更多的路径与它相连,其它的兔子窝只有1条或2条路径与其相连。换句话讲,这些兔子窝之前的路径构成一张N个点、M条边的无向连通图,而度数大于2的点至多有1个。

    兔子们决定把其中K个兔子窝扩建成临时避难所。当危险来临时,每只兔子均会同时前往距离它最近的避难所躲避,路程中花费的时间在数值上等于经过的路径条数。为了在最短的时间内让所有兔子脱离危险,请你安排一种建造避难所的方式,使最后一只到达避难所的兔子所花费的时间尽量少。

    【输入】

             第一行有3个整数N,M,K,分别表示兔子窝的个数、路径数、计划建造的避难所数。

    接下来M行每行三个整数x,y,表示第x个兔子窝和第y个兔子窝之间有一条路径相连。任意两个兔子窝之间至多只有1条路径。

     

    【输出】

    一个整数,表示最后一只到达避难所的兔子花费的最短时间。

     

    【输入输出样例1】

    rabbit.in

    rabbit.out

    5 5 2

    1 2

    2 3

    1 4

    1 5

    4 5

    1

             见选手目录下的rabbit / rabbit1.in与rabbit / rabbit1.out

     

    【输入输出样例1说明】

             在第2个和第5个兔子窝建造避难所,这样其它兔子窝的兔子最多只需要经过1条路径就可以到达某个避难所。

     

    【输入输出样例2】

             见选手目录下的rabbit / rabbit2.in与rabbit / rabbit2.out

     

    【数据规模与约定】

             对于30%的数据,N≤15,K≤4;

             对于60%的数据,N≤100;

             对于100%的数据,1≤K≤N≤1,000,1≤M≤1,500

     

     

  • 相关阅读:
    如何心无旁鹜的编程
    [转]虚拟现实和现实增强技术带来的威胁
    Mac上好用软件集锦
    无论如何都要来报到
    Unity3D脚本语言UnityScript初探
    X3DOM新增剪裁平面节点ClipPlane支持
    用Perl编写Apache模块续二
    如何浪费自己青春
    macbook 我们需要买吗
    看了一本Unity3D的教程
  • 原文地址:https://www.cnblogs.com/sjymj/p/5967742.html
Copyright © 2011-2022 走看看