CF161B Discountscode
貪心。很顯然對於一個板凳(價格爲c
)所能使咱們最多少花費$\frac{c}{2}$的金錢。排序
緣由以下:ip
若是你將一件價格比該板凳大的商品與板凳放在一塊兒沒有貢獻。ci
若是你將一件價格比該板凳小的商品與板凳放在一塊兒貢獻減少。get
貪心策略:將板凳中價格前$k-1$大的單獨放一輛購物車,板凳不夠就用商品便可。string
#include<iostream> #include<cstring> #include<string> #include<cstdio> #include<algorithm> #include<iomanip> #define min(a,b) a<b?a:b inline void read(int &T) { int x=0;bool f=0;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=!f;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} T=f?-x:x; } inline void write(int x) { if(x<0) putchar('-'),write(-x); else { if(x/10) write(x/10); putchar(x%10+'0'); } } int n,k; struct dx { int w,type,num; friend bool operator <(dx x,dx y) { if(x.type==y.type) return x.w>y.w; return x.type<y.type; }//板凳比其餘商品的優先級要高,價格高的比價格低的優先級要高。 }a[1001]; int main() { read(n),read(k); for(int i=1;i<=n;++i) { read(a[i].w),read(a[i].type);a[i].num=i; } std::sort(a+1,a+n+1);//排序,如此排序後將作法轉化爲了將k-1間商品單獨放一輛購物車,剩餘商品放入最後一輛購物車。 double cost=0;bool f=0; int minn=0x7fffffff; for(int i=1;i<=n;++i) { if(i<=k-1) { if(a[i].type==1) cost+=a[i].w*1.0/2.0; else cost+=a[i].w*1.0; }else { cost+=a[i].w*1.0; minn=min(minn,a[i].w); if(a[i].type==1) f=1;//若是剩餘商品中有個板凳的話要價格減半。 } } if(f) cost-=minn*1.0/2.0; std::cout<<std::fixed<<std::setprecision(1)<<cost<<'\n';//注意保留一位小數 for(int i=1;i<=k-1;++i) { printf("1 %d\n",a[i].num); } printf("%d ",n-k+1); for(int i=k;i<=n;++i) { printf("%d ",a[i].num); } puts(""); return 0; }