hdu4221

/*
分析:

    刚开始用的是反证法,反证法毕竟是猜答案然后证明它不错,既然想
到了正确的思路,那么反证法的就不啰嗦了,下面是我的思路,囧~~~


    假设存在一个序列(顺序任意),元素编号0~n-1,用base[i]表示0~i
所有元素的C[i]之和,取l>i,则有:
    ans[i]=base[i]-D[i];          (1)
    ans[l]=base[l]-D[l];           (2)
将i、l交换位置后,有:
    ans'[i]=base[l]-D[i];         (3)
    ans'[l]=base[i]-D[l];          (4)
取:
    max1=max((1),(3))=(3)=ans'[i];
    max2=max((2),(4))=(2)=ans[l];
则有:
    max1-max2=(base[l]-D[i])-(base[l]-D[l])=D[l]-D[i]。

用MAX表示4个式子的最大值:
    <1>当D[l]>D[i]时:
        MAX=max1,既MAX出现在了i、l交换位置后,让i在l后面的情况。
    (1)、(2)式子属于一种现实,(3)、(4)式子属于另一种现实,“我们
    需要做的是,使现实存在的情况中的max尽量小,所以我们要干掉i、
    l交换位置的情况,把等于max1的MAX消灭掉”,既:
        “当D[l]>D[i]时,不让i、l交换位置,不让i在l后面,既让i在
    l前面”
    <2>对于D[l]<D[i]的情况,同理。

    推理结束。
    所以按照上面的思想,将所有元素的完成时间按照从小到
大排序后,逐步计算即可。

                                                            2012-11-09
*/












#include"stdio.h"
#include"string.h"
#include"stdlib.h"
struct A
{
	int c,d;
}E[100011];
int n;
int cmp(const void *a,const void *b)
{
	struct A *c,*d;
	c=(struct A *)a;
	d=(struct A *)b;
	return c->d-d->d;
}
int main()
{
	int T,Case;
	int i;
	__int64 base;
	__int64 ans;
	scanf("%d",&T);
	for(Case=1;Case<=T;Case++)
	{
		scanf("%d",&n);
		for(i=0;i<n;i++)	scanf("%d%d",&E[i].c,&E[i].d);
		qsort(E,n,sizeof(E[0]),cmp);


		base=0;
		ans=0;
		__int64 temp;
		for(i=0;i<n;i++)
		{
			temp=E[i].c+base-E[i].d;
			base+=E[i].c;
			if(temp>ans)	ans=temp;
		}
		printf("Case %d: %I64d\n",Case,ans);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值