您的位置:首页 > 其它

codeforces 3B. Lorry

2013-05-29 21:13 218 查看
给定卡车容量,及各物品所占体积和拥有价值,体积要么为1要么为2

贪心排序,最后一个要加进去的物品需要讨论多种情况

#include <stdlib.h>

#include <string.h>

#include <stdio.h>

#include <ctype.h>

#include <math.h>

#include <stack>

#include <queue>

#include <map>

#include <set>

#include <vector>

#include <string>

#include <iostream>

#include <algorithm>

using namespace std;

#define ll long long

#define ls rt<<1

#define rs ls1

#define lson l,mid,ls

#define rson mid+1,r,rs

#define middle (l+r)>>1

#define eps (1e-9)

#define clr_all(x,c) memset(x,c,sizeof(x))

#define clr(x,c,n) memset(x,c,sizeof(x[0])*(n+1))

#define MOD 1000000007

#define inf 100000007

#define pi acos(-1.0)

#define for(i,a,b) for(i=(a);i<(b);i++)

#define M 100000+5

struct type{

int n,v,f,d;

long long c;

}v[M];

int n,vm,vsum,csum;

bool cmp(type x,type y){

if(x.c!=y.c)return x.c>y.c;

else return x.d>y.d;

}

int main(){

int i,j,x,y,k,t;

while(~scanf("%d %d",&n,&vm)){

memset(v,0,sizeof(v));

for(i,0,n){

scanf("%d %d",&x,&y);

v[i].n=i; v[i].v=x;

v[i].c=y/x; v[i].d=y-y/x*x;

}

sort(v,v+n,cmp);

i=0;vsum=0,csum=0;

while(i<n&&vsum+v[i].v<=vm){

vsum+=v[i].v;

csum+=(v[i].c*v[i].v+v[i].d);

v[i++].f=1;

}

t=i;

if(vsum<vm){

for(j,t,n)

if(v[j].v==1)break;

for(i,0,t)

if(v[i].v==1)k=i;

if(k<t&&j==n){

if(csum-(v[k].c*v[k].v+v[k].d)+(v[t].c*v[t].v+v[t].d)>csum){

v[k].f=0;

v[t].f=1;

csum=csum-(v[k].c*v[k].v+v[k].d)+(v[t].c*v[t].v+v[t].d);

}

}else if(k<t&&j<n){

if(csum-(v[k].c*v[k].v+v[k].d)+(v[t].c*v[t].v+v[t].d)>csum+(v[j].c*v[j].v+v[j].d)){

v[k].f=0;

v[t].f=1;

csum=csum-(v[k].c*v[k].v+v[k].d)+(v[t].c*v[t].v+v[t].d);

}else {

v[j].f=1;

csum+=(v[j].c*v[j].v+v[j].d);

}

}else if(k==t&&j<n){

v[j].f=1;

csum+=(v[j].c*v[j].v+v[j].d);

}

}

printf("%d\n",csum);

int f=0;

for(i,0,n){

if(f==0&&v[i].f==1)printf("%d",v[i].n+1),f=1;

else if(v[i].f==1)printf(" %d",v[i].n+1);

}

if(f==1)puts("");

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: