美团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;
}
思路分析:仔细看题目可以知道,给出的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、分数
其他的以后补上……