codeforces-3B Lorry

题意:给定船只大小及承载能力,在空间大小一定的情况下求最大的承载能力

#include <stdio.h>
#include <stdlib.h>
typedef struct Boat{
    int capacity,id,space;
    float ratio;
}Boat;

int cmp(const void *a,const void *b){
    // if ( (*(Boat*)a).ratio > (*(Boat*)b).ratio )
    //  return  -1;
    // if ( (*(Boat*)a).ratio < (*(Boat*)b).ratio )
    //  return  1;  
    // if ( (*(Boat*)a).ratio == (*(Boat*)b).ratio )
    //  return (*(Boat*)a).space > (*(Boat*)b).space ?1:-1;
        
        return (*(Boat*)a).ratio > (*(Boat*)b).ratio ?-1:1;
    
    
}

Boat boat[100005];
int order[100005];  
int main(){

    int n,v,i,j,k=0,optimal=0,lastKayaks=-1,lastK,edgeKayaks=-1,edgeK,uncheckC=-1,uncheckK=-1,allcapacity=0 ;
    scanf("%d%d",&n,&v);
    for(i=0;i<n;i++){
        boat[i].id=i+1;
        scanf("%d%d",&boat[i].space,&boat[i].capacity);
        if(boat[i].space==1)
            boat[i].ratio=boat[i].capacity/1.0; 
        else
            boat[i].ratio=boat[i].capacity/2.0;
    }
    qsort(boat,i,sizeof(boat[0]),cmp);

    for(j=0;j<i;j++){
        if(v-boat[j].space==0){
            optimal+=boat[j].capacity;
            order[k++]=boat[j].id;
            v-=boat[j].space;
            if(boat[j].space == 1){
                edgeK = k-1;
                edgeKayaks = j; 
            }
        }
        else if(v-boat[j].space>0){
            optimal+=boat[j].capacity;
            order[k++]=boat[j].id;
            v-=boat[j].space;
            if(boat[j].space == 1){
                lastK = k-1;
                lastKayaks = j; 
            }
        }
        else{
                if(uncheckC==-1&&boat[j].space==2) 
                    uncheckC = j;  
            }                
    }
    if(v==0&&edgeKayaks!=-1&&uncheckC!=-1){
         if(boat[uncheckC].capacity - boat[lastKayaks].capacity - boat[edgeKayaks].capacity  >0){
                order[lastK]=boat[uncheckC].id;
                k--;
                optimal+=boat[uncheckC].capacity - boat[lastKayaks].capacity - boat[edgeKayaks].capacity ;
            }
        
    }
    if(v==1&&lastKayaks!=-1&&uncheckC!=-1){
         if(boat[uncheckC].capacity - boat[lastKayaks].capacity >0){
                order[lastK]=boat[uncheckC].id;
                optimal+=boat[uncheckC].capacity - boat[lastKayaks].capacity ;
            }
    }
    printf("%d\n",optimal);
    for(i=0;i<k;i++){
        printf("%d ",order[i]);
    }

}



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • �嘿,现在的你在干嘛呢?是和一群人在唱K,划拳,喝酒,聊天,还是一个人在抱着手机默默的刷着微信,微博,朋友圈,是在...
    叫我小蛮妖zy阅读 3,909评论 0 1
  • 生活犹如叶子一般,随风起舞,没有方向,亦没有终点站 它又如细细绵绵的雪球,似乎正向地面坠落,但似乎总在触地的前一刻...
    曼可阅读 1,248评论 1 1
  • 早晨不知道是什么意识迫使我睁开眼睛,眼前有点模糊。手很自然的摸到床头边,试图去拿手机,摸索了一会,没有寻到手机的足...
    太太太梓飞阅读 1,371评论 1 1
  • A 朋友X偶尔会抱怨她的舍友,四个人合住,本一开始也还各自维护着和谐的关系,但时间长久之后,矛盾越积越多,隔一段时...
    可可布朗尼阅读 3,244评论 0 0