zoukankan      html  css  js  c++  java
  • 美团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、分数

    其他的以后补上……

     

  • 相关阅读:
    WebRTC之完整搭建Jitsi Meet指南
    使用Jibri进行Jitsi Meet视频录制
    完整开源免费视频会议Jitsi-meet安装教程
    iOS聊天起泡(背景图片被拉伸不变形)----转载--待验证
    技术人对赚钱的思考与摸索
    模板引擎的思考
    SpringBoot单文件与多文件上传
    数据库被删之反思
    分布式配置中心之思考
    正版office产品密钥-激活码
  • 原文地址:https://www.cnblogs.com/zhgyki/p/9490497.html
Copyright © 2011-2022 走看看