CF161B Discounts

1522713-20191008160551932-1628026110.png

3 2
2 1
3 2
3 1
5.5
2 1 2
1 3
4 3
4 1
1 2
2 2
3 2
8.0
1 1
2 4 2
1 3

按照大小排下序,你会发现,如果按照从大到小的顺序,那么给凳子打折一定是最优的

于是,我们就可以找凳子打折,最后无论剩下多少都撂倒最后一个购物车里

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define maxn 1200
#define rep(x,y,z) for(int x = y ; x <= z ; x ++)
using namespace std ;
struct dy{
    int c , t , id ;
}a[maxn] ;
int n , m , l , pos , num , sum , res , g[maxn] , s[maxn] , ans[maxn][maxn] , k;
bool book[maxn] ;
double money ;
int cmp(dy x , dy y) {
    return x.c > y.c ;
}  
int main() {
    scanf("%d%d",&n,&k) ;
    rep(i,1,n) {
        a[i].id = i ;
        scanf("%d%d",&a[i].c,&a[i].t) ;
        if(a[i].t == 1) res ++ ;
    }sort(a+1,a+1+n,cmp) ;
    rep(i,1,n) {
        if(k > 1 && a[i].t == 1) {
            k -- ;
            res -- ;
            book[i] = 1 ;
            ans[++num][++s[num]] = a[i].id ;
            money += 0.5*double(a[i].c) ;
            if(!res) break ;
        }
    }
    if(res) {
        rep(i,1,n) {
            if(book[i]) continue ;
            pos = i ;
            g[++sum] = a[i].id ;
            money += double(a[i].c) ;
        }
        money -= 0.5*double(a[pos].c) ;
    }else {
        rep(i,1,n) {
            if(book[i]) continue ;
            if(k > 1) {
                k -- ;
                ans[++num][++s[num]] = a[i].id ;
                money += double(a[i].c) ;
            }else {
                g[++sum] = a[i].id ;
                money += double(a[i].c) ;
            }
        }
    }
    printf("%.1lf\n",money) ;
    rep(i,1,num) {
        printf("%d ",s[i]) ;
        rep(j,1,s[i]-1) {
            printf("%d ",ans[i][j]) ;
        }printf("%d\n",ans[i][s[i]]) ;
    }
    if(!sum) return 0 ;
    printf("%d " , sum ) ;
    rep(i,1,sum-1) {
        printf("%d ",g[i]) ;
    }printf("%d\n",g[sum]) ;
    return 0 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值