NC20135. [JLOI2013]卡牌游戏
描述
输入描述
第一行包括两个整数N,M分别表示玩家个数和卡牌总数。
接下来一行是包含M个整数,分别给出每张卡片上写的数字。
输出描述
输出一行包含N个百分比形式给出的实数,四舍五入到两位小数。
分别给出从玩家1到玩家N的胜出概率,每个概率之间用空格隔开,最后不要有空格。
示例1
输入:
5 5 2 3 5 7 11
输出:
22.72% 17.12% 15.36% 25.44% 19.36%
C++(g++ 7.5.0) 解法, 执行用时: 4ms, 内存消耗: 488K, 提交时间: 2022-08-02 20:03:36
#include<bits/stdc++.h> using namespace std; const int maxn=50+5; typedef long long ll; double dp[maxn][maxn]; int a[maxn]; int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++)scanf("%d",&a[i]); dp[1][1]=1.0; for(int i=2;i<=n;i++) for(int j=1;j<=i;j++) for(int k=1;k<=m;k++) dp[i][j]+=dp[i-1][((i+j-a[k]%i)+i)%i]/(1.0*m); for(int i=1;i<=n;i++)printf("%.2lf%% ",dp[n][i]*100.0); return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 5ms, 内存消耗: 740K, 提交时间: 2020-03-30 15:48:29
#include<bits/stdc++.h> using namespace std; double dp[100][100]; int a[100]; int main() { int n,m; cin>>n>>m; for(int i=1;i<=m;i++) cin>>a[i]; dp[1][1]=1; for(int i=2;i<=n;i++) { for(int k=1;k<=m;k++) { for(int j=1;j<=i;j++) { int p=a[k]%i; dp[i][j]+=dp[i-1][(j-p-1+i)%i+1]/m; } } } for(int i=1;i<=n;i++) { printf("%.2f%% ",dp[n][i]*100); } cout<<endl; return 0; }