问题 G: 哥本哈根妖

 

内存限制:128 MB时间限制:2 S标准输入输出

 

 

题目描述

“哥本哈根妖知晓一切事件发生的概率。”——《Copenhagen Lorem Ipsum》
凯文为了入侵目标服务器,计划出n种不同的入侵方法。你从哥本哈根妖口中得知,使用第i种方法入侵目标服务器所需要的入侵时间为ti,入侵成功概率为pi。当凯文成功入侵目标服务器,或者这n种不同的入侵方法都失败后,凯文将会停止行动。
以不同的顺序执行入侵目标服务器的方法,期望停止行动时间一般是不同的。
请你告诉凯文,应该以何种顺序行动才能使期望停止行动时间最短?
如果两种行动顺序的期望停止行动时间相同,输出字典序最小的行动顺序。

 

输入格式

第一行包含一个正整数T(1≤T≤20,000)代表测试数据组数。
每一组数据包含三行。第一行一个正整数n(1≤n≤50)代表入侵方法的种类数。第二行包含n个正整数,第i种入侵方法的入侵时间为ti(1≤ti≤10)。第三行包含n个双精度浮点数,第i种入侵方法的成功概率为pi(0≤pi≤1)。

 

输出格式

对于每一组数据,按照行动的顺序输出方法的编号,注意行末没有空格。

 

输入样例 复制

2
1
1
1.000
2
1 2

0.300 0.700

 

输出样例 复制

1
2 1

 

问题 G: 哥本哈根妖_C语言

 

代码:

#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
double const exp1=0.0000000001;
struct node
{
int x;
double t,p,tx;
};
struct node s[105];
bool cmp(node a, node b)
{
if(fabs(a.tx - b.tx) > exp1 )
return a.tx > b.tx;
else
return a.x < b.x;
}
int main()
{
int i,n,t;
while(scanf("%d",&t) != EOF)
{
while(t --)
{
scanf("%d",&n);
for(i = 0; i < n; i ++)
scanf("%lf",&s[i].t);
for(i = 0; i < n; i ++)
{
scanf("%lf",&s[i].p);
s[i].x = i + 1;
s[i].tx = s[i].p / s[i].t;
}
sort(s,s+n,cmp);
for(i = 0; i < n; i ++)
{
if(i != 0)
printf(" ");
printf("%d",s[i].x);
}
printf("\n");
}
}
return 0;
}