| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
建议以后发到个人邮箱里,不要贴出来...In Reply To:Re:有人能给一下accept的原代码吗,十分感谢! Posted by:zhucheng at 2004-12-09 19:52:36 > 枚举width的下界,每次贪心计算最优,然后求得到全局最优
> AC code
> 应该还可以优化。
> #include <iostream>
> #include <algorithm>
> #include <iomanip>
> using namespace std;
> int width[10000];
> int top;
>
> struct man
> {
> int price,width;
> };
>
> struct node
> {
> man value;
> node* next;
> node():next(NULL){};
> };
>
> node *head[100];
> void init()
> {
> int i;
> for(i=0;i<100;i++)
> {
> head[i]=new node();
> }
> }
>
> void clear(int n)
> {
> node* dp;
> int i;
> for(i=0;i<n;i++)
> {
> dp=head[i]->next;
> while(dp!=NULL)
> {
> head[i]->next=dp->next;
> delete dp;
> dp=head[i]->next;
> }
> }
> }
>
>
>
> inline int cmp(const man& m1,const man& m2)
> {
> if(m1.price<=m2.price&&m1.width>=m2.width)
> return 1;
> if(m2.price<=m1.price&&m2.width>=m1.width)
> return -1;
> return 0;
> }
>
> inline bool cmp1(const man& m1,const man& m2)
> {
> return m1.width*m2.price>m1.price*m2.width;
> }
>
> bool cmp2(int a,int b)
> {
> return a>b;
> }
>
>
> void insert(const man& in,int index)
> {
> node *sp,*pre;
> int c;
> bool inser=true;
> pre=head[index];
> sp=pre->next;
> while(sp!=NULL)
> {
> c=cmp(in,sp->value);
> if(c==1)
> {
> pre->next=sp->next;
> delete sp;
> sp=pre->next;
> }
> else if(c==-1)
> {
> inser=false;
> break;
> }
> else
> {
> pre=sp;
> sp=sp->next;
> }
> }
> if(inser)
> {
> sp=head[index]->next;
> pre=head[index];
> while(sp!=NULL&&sp->value.price<in.price)
> {
> pre=sp;
> sp=pre->next;
> }
> pre->next=new node();
> pre=pre->next;
> pre->value.price=in.price;
> pre->value.width=in.width;
> pre->next=sp;
> }
> }
>
>
>
> int read(int n)
> {
> int i,j,m;
> int maxrow,minmaxrow=0x7fffffff;
> man readin;
> top=0;
> for(i=0;i<n;i++)
> {
> cin>>m;
> maxrow=0;
> for(j=0;j<m;j++)
> {
> cin>>readin.width>>readin.price;
> width[top++]=readin.width;
> maxrow=max(readin.width,maxrow);
> insert(readin,i);
> }
> minmaxrow=min(minmaxrow,maxrow);
> }
> sort(width,width+top,cmp2);
> return minmaxrow;
> }
>
>
> int findminprice(int index,int boundwidth)
> {
> node* sp=head[index]->next;
> while(sp->value.width<boundwidth)
> {
> sp=sp->next;
> }
> return sp->value.price;
> }
>
>
> int findmax(int boundwidth,int n)
> {
> int allprice=0;
> int i;
> for(i=0;i<n;i++)
> {
> allprice+=findminprice(i,boundwidth);
> }
> return allprice;
> }
>
> int main()
> {
> int test,n,boundw,nextindex;
> man currentman,minman;
> cin>>test;
> init();
> while(test>0)
> {
> test--;
> cin>>n;
> boundw=read(n);
> minman.width=boundw;
> minman.price=findmax(boundw,n);
> nextindex=0;
> while(width[nextindex]!=boundw)
> nextindex++;
> while(nextindex<top&&width[nextindex]==boundw)
> nextindex++;
> while(nextindex<top)
> {
> boundw=width[nextindex];
> currentman.width=boundw;
> currentman.price=findmax(boundw,n);
> if(cmp1(currentman,minman))
> {
> minman.price=currentman.price;
> minman.width=currentman.width;
> }
> while(nextindex<top&&width[nextindex]==boundw)
> nextindex++;
> }
> clear(n);
> cout<<fixed<<setprecision(3)<<(double)minman.width/(double)minman.price<<endl;
> }
> return 0;
> }
>
>
>
>
>
>
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator