作业帮 > 综合 > 作业

acm题,wrong answer,为什么?

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/11/08 10:56:02
acm题,wrong answer,为什么?
Description
James得到了一堆有趣的硬币,于是决定用这些硬币跟朋友们玩个小游戏.在一个N行M列的表格上,每一个第i行第j列的格子上都放有一枚James的硬币,抛该硬币正面朝上的概率为Pij,所有抛硬币事件两两之间是相互独立的.
现在,玩家在M列硬币中,从每一列里各选择1枚,共M枚,构成一组.如此重复选择N组出来,且保证被选择过的硬币不能再选.选好组之后,每组的M枚硬币各抛一次,如果都是正面朝上,则该组胜利,总分赢得1分;否则该组失败,总分不加也不减.请问,如果让你自行选择硬币的分组,游戏总得分的数学期望的最大值是多少?
Input
输入有多组数据.每组数据第一行为N和M,1≤N≤100,1≤M≤10,以空格分隔.接下来有N行,每行M个小数,表示表格中对应的Pij.
输入以N=M=0结束,这组数据不输出结果.
Output
对于每组数据,输出对应游戏总得分的数学期望的最大值,四舍五入精确至4位小数.每组数据的输出占一行.
代码:
#include
#include
#include
#define N 101
#define M 11
int compare(const void *a,const void *b)
{
\x05return *(int*)b-*(int*)a;
}//
int main()
{
\x05float a[M][N]={};
\x05int m=0,
\x05\x05n=0;
\x05int i,j;
\x05float sum,Sum;
\x05while(scanf("%d %d",&n,&m) = EOF && m = 0 && n = 0)//***有可能会出错 ***
\x05{//大循环
\x05\x05sum=1;Sum=0;//初始化
\x05\x05memset(a,0,sizeof(a));
\x05\x05for(j=0;j
主要问题出在比较函数上#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 101
#define M 11
// 需要直接比较double,而不能返回差值
int compare(const void *a, const void *b)
{
double* da = (double*)a;
double* db = (double*)b;
if (*da > *db) {
return -1;
}
else if (*db > *da) {
return 1;
}
return 0;
}// 
int main()
{
double a[M][N];
int m = 0,
n = 0;
int i, j;
double sum, Sum;
while (scanf("%d %d", &n, &m) != EOF && m != 0 && n != 0)//***有可能会出错 ***
{//大循环 
sum = 1; Sum = 0;//初始化
for (j = 0; j<n; j++)
for (i = 0; i < m; i++)
scanf("%lf", &a[i][j]);//输入 
for (i = 1; i <= m; i++)
qsort(a[i], m, sizeof(double), compare);//从大到小排序
for (j = 0; j<n; j++)
{
for (i = 1; i <= m; i++)
sum *= a[i][j];
Sum += sum;
sum = 1;//初始化 
}
printf("%.4f\n", Sum);
}//大循环 
}
再问: 我是在网上学的这个compare函数的写法;而且在cfree上也是可以正确的运行的!是不是cfree的编译器和acm的编译器不太一样啊!那我该用什么软件来测试acm的题呢?求大牛推荐一下!!!
再答: 因为double作减法以后是一个double,这个double如果是-1到1之间的话,转换成int以后就是0
返回0意味着你告诉编译器两个double是等价的(即先后不分),但是其实这不是你想要的结果