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;
}
贪心排序,最后一个要加进去的物品需要讨论多种情况
#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;
}
相关文章推荐
- Codeforces 3B. Lorry
- Codeforces(429D - Tricky Function)最近点对问题
- codeforces_452A
- CodeForces 659A Round House
- Codeforces 303A Lucky Permutation Triple【思维】
- Codeforces 811 A Vladik and Courtesy
- Codeforces 876 C Classroom Watch 基础数学,暴力
- CodeForces 197A
- Codeforces 578C Weakness and Poorness
- CodeForces 653 A. Bear and Three Balls
- Codeforces 406B Toy Sum【思维】
- CodeForces - 812B
- Codeforces 815 C 树形依赖背包 解题报告
- codeforces 432C Prime Swaps
- 51nod 1232 完美数 / codeforces 55D 数位DP
- CodeForces 653 A. Bear and Three Balls(数学 ,快排)
- codeforces-233【B思维】
- Codeforces 221d D. Little Elephant and Array
- [杂题]Codeforces 860D. Wizard's Tour
- codeforces 1A Theatre Square(再来一水题)