A.Average Score
https://vjudge.net/problem/ZOJ-3819
题目大意:你持有一份成绩,如果你去另一个班,两个班的平均成绩都会比现在高。
N —— 你所在班级的人数 M —— 隔壁班人数
Sum1 —— 你所在班级的总分(除去你) Sum2 —— 隔壁班总分
得到数学表达式:
注意对于上界需要向下取整,对于下界需要向上取整,考虑到临界值,应进行适当处理。
AC代码:
#include <iostream>
#include <cmath>
using namespace std;
int T;
int n, m;
double sum1, sum2,ans;
int main() {
while(cin >> T) {
while(T--) {
sum1= 0; sum2 = 0;
cin >> n >> m;
for(int i = 0; i < n - 1; i++) {
cin >> ans;
sum1 += ans;
}
for(int i = 0; i < m; i++) {
cin >> ans;
sum2 += ans;
}
cout << floor(sum2 / m) + 1 << " " << ceil((sum1 / (n - 1))) - 1 << endl;
}
}
return 0;
}
D.Domination
https://vjudge.net/problem/ZOJ-3822
题目大意:随便扔子,求得棋盘所有列和行都有棋子时所需要的棋子期望。
思路:一开始毫无思路。以为是算单独每个格子对于结果的贡献值,参考大神的题解才知道原来是dp。。。。
AC代码:(状态转移方程)
#include <iostream>
#include <cstring>
using namespace std;
double dp[55][55][2555];
double ans = 0;
int n,m;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof dp);
scanf("%d%d",&n,&m);
dp[0][0][0]=1.0;
for(int k=0; k<=n*m; k++)
{
for(int i=0; i<=n; i++)
{
for(int j=0; j<=m; j++)
{
if(i==n && j==m) continue; //特别注意
//状态转移方程
dp[i][j][k+1]+=dp[i][j][k]*(i*j-k)/(n*m-k); //k + 1
dp[i+1][j][k+1]+=dp[i][j][k]*(n-i)*j/(n*m-k);//i + 1
dp[i][j+1][k+1]+=dp[i][j][k]*(m-j)*i/(n*m-k);//j + 1
dp[i+1][j+1][k+1]+=dp[i][j][k]*(n-i)*(m-j)/(n*m-k);//i,j,k + 1
}
}
}
for(int i=0; i<=n*m; i++)
{
ans+=i*dp[n][m][i];
}
printf("%.12f\n",ans);
}
return 0;
}
I.Information Entropy
https://vjudge.net/problem/ZOJ-3827
字符串+ 数学
AC代码: 待补.