美团2018年CodeM大赛-资格赛

 

https://www.nowcoder.com/acm/contest/138#question

A、下单 

    水题……

B、可乐

 题意:求期望

代码

#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<queue>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long long ll;
typedef pair<int,int> PII;
#define mod 1000000007
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
//head
#define INF 0x3f3f3f3f
#define N 10005
int n,m,k;
int a[N];
int main()
{
     ios_base::sync_with_stdio(0); cin.tie(0);
    cin>>n>>m>>k;
    int minn=-INF;
    int f;
    for(int i=0;i<k;i++)
    {
        int x,y;
        cin>>x>>y;
        int tmp=m*x+(n-m)*y;
        if(tmp>=minn)
        {
            minn=tmp;
            f=i;
        }
    }
    for(int i=0;i<k;i++)
    {
        if(i==f)
            cout<<n;
        else cout<<"0";
        if(i==k-1)
            cout<<endl;
        else cout<<" ";
    }
    return 0;

}

C、世界杯 (dp)

思路分析:仔细看题目可以知道,给出的PK顺序已经是有序的了,就是前面胜利的与临接的后面胜利的队伍打。具体来说:把16支队伍标识成1.....16.

第一轮:1和2打,3和4打,5和6打......15和16打。(这里是输入给出的单个队伍胜利单个队伍)

第二轮:12中胜利的和34中胜利的打,56中胜利的和78胜利的打,910胜利的和11 12胜利的打......。(将1234看作一个大组,那么都减去一个1之后    0123   除以4 都等于 0 。       同理  5678都减一除以4等于1.....依次类推)

第三轮:1234胜利和5678打,9 10 11 12胜利和13 14 15 16胜利的打。(12345678 减一 除以 8 等于0  ....)。

第四轮12345678 和后面八支队伍打,决胜出冠军。

我们可以看到比赛总共打4轮,每轮在一个当前大组内的决出一个胜利者进行下轮  比如12 打34  胜利者进入第三轮。那么我们将1234看作大组,将12 和 34 看作两个小组,这两个小组已经在上一轮决出胜负,1 2 减一 除以 2 是一组,3 4 减一除以2 是一组。

然后说完分组,来说概率。

在一个大组内,比如1234.我们可以分别算出1 2 3 4在一个大组内胜出的概率  记为dp[1.....4][2](第二轮)。  假设1要胜出,那么1要胜利了2 之的概率也就是  dp[1][1](第一轮胜出的概率) ,如果3胜出 那么dp[1][1] * dp[3][1](3在第一轮胜出的概率)*F[1][3](1要胜3的概率)    加上  如果4要胜出的概率 dp[1][1] * dp[4][1](4在第一轮胜出的概率)*F[1][4](1要胜3的概率) 。

一直递推就是答案。

dp[i][j]代表第i支球队在j轮胜出的概率。

总共进行4轮

dp[i][4]就是答案。

代码如下:

 

#include<iostream>
#include<bits/stdc++.h>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<queue>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long long ll;
typedef pair<int,int> PII;
#define mod 1000000007
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
//head
#define INF 0x3f3f3f3f
#define N 16
double dp[N+5][5];
double F[N+5][N+5];
int main()
{
     ios_base::sync_with_stdio(0); cin.tie(0);
    for(int i=1;i<=N;i++)
        for(int j=1;j<=N;j++)
        cin>>F[i][j];
        memset(dp,0,sizeof(dp));
    for(int i=1;i<=N;i++)
    {
        if(i%2==0) dp[i][1]=F[i][i-1];
        else dp[i][1]=F[i][i+1];
    }
    for(int i=2;i<=4;i++)
    {
        int sub=1<<i;
        for(int j=1;j<=N;j++)
        {
            for(int k=1;k<=N;k++)
            {
                if((j-1)/sub==(k-1)/sub)
                {
                    if((j-1)/(sub/2)!=(k-1)/(sub/2))
                        dp[j][i]+=dp[j][i-1]*dp[k][i-1]*F[j][k];
                }
            }
        }
    }
    for(int i=1;i<=N;i++)
        cout<<setprecision(17)<<dp[i][4]<<" ";
    cout<<endl;
    return 0;

}

 

参考博客:https://blog.csdn.net/ACpartner/article/details/80512042

 

D、分数

其他的以后补上……

 

 

posted @ 2018-08-16 22:18  better46  阅读(270)  评论(0编辑  收藏  举报