[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;
}

 

posted @ 2017-03-11 15:55  李璐颖  阅读(111)  评论(0)    收藏  举报