您的位置:首页 > 其它

hdu 4442 Physical Examination (2012年金华赛区现场赛A题)

2014-10-21 16:19 288 查看
昨天模拟赛的时候坑了好久,刚开始感觉是dp,仔细一看数据范围太大。

题目大意:一个人要参加考试,一共有n个科目,每个科目都有一个相应的队列,完成这门科目的总时间为a+b*(前面已完成科目所花的总时间)。问:怎样安排考试的顺序使考完所花的总时间最短。

分析:假设已经花了time时间,在剩下的科目中任意取两个科目x,y。

先考试x:Tx=time+(ay*time+ax+bx*by*(ax+time));

先考试y:Ty=time+(by*time+bx+ax+ay*(bx+time))。

化简之后发现花费时间的差距在ax*by,ay*bx,那么按照ai/bi的大小进行排序就ok了。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define N 100010
#define INF 0xffffffff
#define MOD (365*24*60*60)

struct node
{
__int64 a, b;
double s;
};
node stu
;

int cmp (const void *a, const void *b)
{
node *c = (node *)a;
node *d = (node *)b;

return c->s > d->s ? 1:-1;
}

int  main ()
{
__int64 n, i, sum;

while (scanf ("%I64d", &n), n)
{
for (i=0; i<n; i++)
{
scanf ("%I64d %I64d", &stu[i].a, &stu[i].b);
if (!stu[i].a)
stu[i].s = 0;
else if (!stu[i].b)
stu[i].s = INF;
else
stu[i].s = 1.0 * stu[i].a / stu[i].b;
}

qsort (stu, n, sizeof(stu[0]), cmp);
sum = 0;

for (i=0; i<n; i++)
{
sum += (stu[i].a + stu[i].b * sum) % MOD;
sum %= MOD;
}

printf ("%I64d\n", sum);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: