[HDU1009]鼠猫交易问题
这道题我的思路是用链表实现“单价”的排序,并且保证链表中记录的交易数目不超过老鼠所拥有的”猫食物“总量。
提交后我发现自己的程序exe.time是31ms,而其他用数组来快速排序的程序也并没有超时。感觉自己想复杂了点。
另外,本题需要注意的是:
1.”单价“等数据应使用double类型,而float由于乘除运算会有误差。
2.会有“善良”的猫,免费送给老鼠食物。(这一点也是出乎意料的23333333)
以下是我的代码:
#include<stdio.h>
#include<stdlib.h>
struct trade
{
int catfood;
double ratio;
int tradenum;
struct trade * nextp;
};
int main()
{
int pre,room;
double getsum;
double minratio;
int paysum;
int i;
int cujavabean,cucatfood;
double curatio;
struct trade *head,*p,*newtrade;
scanf("%d%d",&pre,&room);
while(pre!=-1&&room!=-1)
{
if(room==0)
{
printf("0.000\n");
scanf("%d%d",&pre,&room);
continue;
}
head=(struct trade *)malloc(sizeof(struct trade));
head->nextp=NULL;
minratio=0;
paysum=0;
getsum=0;
for(i=0;i<room;i++)
{
scanf("%d%d",&cujavabean,&cucatfood);
if(cucatfood!=0)curatio=(double)cujavabean/(double)cucatfood;
else
{
getsum+=cujavabean;
}
if(curatio>minratio||paysum<pre)
{
newtrade=(struct trade*)malloc(sizeof(struct trade));
newtrade->catfood=cucatfood;
newtrade->ratio=curatio;
newtrade->tradenum=newtrade->catfood;
paysum+=newtrade->catfood;
for(p=head;p->nextp!=NULL&&p->nextp->ratio<=newtrade->ratio;p=p->nextp);
newtrade->nextp=p->nextp;
p->nextp=newtrade;
minratio=head->nextp->ratio;
if(paysum<=pre)
{
continue;
}
else
{
for(p=head->nextp;paysum>pre;p=p->nextp)
{
if(paysum-p->tradenum>=pre)
{
paysum-=p->tradenum;
head->nextp=p->nextp;
p=head;
}
else
{
p->tradenum-=(paysum-pre);
paysum=pre;
}
}
}//else
}//if
}//for
for(p=head;p->nextp!=NULL;p=p->nextp)
{
getsum+=p->nextp->ratio*p->nextp->tradenum;
}
free(head);
printf("%.3f\n",getsum);
scanf("%d%d",&pre,&room);
}//while
return 0;
}

浙公网安备 33010602011771号