12月の大きい1週間の試合の解題の報告

2079 ワード

C題---Oh,my God!
タイトルリンク:click here
まず、パーティーに参加するすべての人は自分の名前が書かれたメモを抽選箱に入れます.それから、すべてのメモが入ってから、一人一人が箱からメモを取ります.最後に、取得したメモに自分の名前が書かれていれば、「おめでとう、当選しました!」このような情況が発生する確率を計算することを求めますか?皆さんが何度も間違っているのを見て、問題の要求を真剣に読んでいないはずです.すべての人が自分の名前を選ぶ確率を要求していることに注意してください.一人ではありません.誤り配列式を用いると,全体的にnの完全な誤り配列スキームの個数が得られ,nで除算される.できます.肝心なのはnの完全なずれスキームの個数を求めることである.n番目の人は前のn-1人の中の任意の人の字条を選ぶことができて、n番目の人はn-1種類の選択があって、n番目の人がi番目の人の字条を取ったと仮定して、この時iはn番目の人の字条を保留することができて、残りのn-2人は完全に間違っています;iがn番目の人のメモを残していないと、n番目の人を除く残りのn-1人が完全に間違っています!繰返し式は、f(n)=(n−1)*(f(n−1)+f(n−2);2つの配列を使用して、小数点を出力することに注意します.参照コード:
#include<stdio.h>
int main()
{
    // freopen("1.txt","r",stdin);
    //freopen("2.txt","w",stdout);
    int i,c,n,cc=1;
    double a[21],b[21];
    a[0]=1;
    for(i=1; i<21; i++)
        a[i]=a[i-1]*i;
    b[1]=0;
    b[2]=1;
    b[3]=2;
    for(i=3; i<21; i++)
        b[i]=(i-1)*(b[i-1]+b[i-2]);
    while(~scanf("%d",&n)&&n)
    {
       //scanf("%d",&n);
       printf("Case [%d]: ",cc++);
       if(n==1)
        printf("100.00%%.
"); else printf("%.2lf%%.
",b[n]*100/a[n]); } return 0; }

E題---Oh,my Paper!リンク:click here
問題の意味ははっきりしていて、あなたに1枚の紙をあげて、n(行)*m(列)あなたが計算するのは1つの対角線から別の対角線までどれだけ歩きますか(上へ、右へしか歩けません).解析:行に列があり、対角線に達するには必ずすべての行と列を通過するマトリクスで、行(n)==列(m)、すなわち列と行をちょうど歩き終え、m+n個の中からmまたはn個を選択してC(m+n,m)またはC(m+n,n)を合成する場合があります.両者が等しくないときは,それを見て先に到着し,すべての最小のものが必ず先に到着する.また,int型よりも1倍大きいunsigned型をデータに適用した.参照コード:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef unsigned long long LL;
//#define  LL long long
int main()
{
    //freopen("3.txt","r",stdin);
    //freopen("4.txt","w",stdout);
	double sum;
	unsigned n,m,a,b;
	while(scanf("%d%d",&n,&m),n||m)
	{
		a=n+m;
		b=n<m?n:m;
		sum=1;
		while(b>0)
		 sum*=a--/double(b--);
		printf("%.0f
",sum); } return 0; }