• Codeforces 810 B. Summer sell-off


     
    time limit per test
    1 second
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    Summer holidays! Someone is going on trips, someone is visiting grandparents, but someone is trying to get a part-time job. This summer Noora decided that she wants to earn some money, and took a job in a shop as an assistant.

    Shop, where Noora is working, has a plan on the following n days. For each day sales manager knows exactly, that in i-th day ki products will be put up for sale and exactly li clients will come to the shop that day. Also, the manager is sure, that everyone, who comes to the shop, buys exactly one product or, if there aren't any left, leaves the shop without buying anything. Moreover, due to the short shelf-life of the products, manager established the following rule: if some part of the products left on the shelves at the end of the day, that products aren't kept on the next day and are sent to the dump.

    For advertising purposes manager offered to start a sell-out in the shop. He asked Noora to choose any f days from n next for sell-outs. On each of f chosen days the number of products were put up for sale would be doubled. Thus, if on i-th day shop planned to put up for sale ki products and Noora has chosen this day for sell-out, shelves of the shop would keep ki products. Consequently, there is an opportunity to sell two times more products on days of sell-out.

    Noora's task is to choose f days to maximize total number of sold products. She asks you to help her with such a difficult problem.

    Input

    The first line contains two integers n and f (1 ≤ n ≤ 105, 0 ≤ f ≤ n) denoting the number of days in shop's plan and the number of days that Noora has to choose for sell-out.

    Each line of the following n subsequent lines contains two integers ki, li (0 ≤ ki, li ≤ 109) denoting the number of products on the shelves of the shop on the i-th day and the number of clients that will come to the shop on i-th day.

    Output

    Print a single integer denoting the maximal number of products that shop can sell.

    Examples
    Input
    4 2
    2 1
    3 5
    2 3
    1 5
    Output
    10
    Input
    4 1
    0 2
    0 3
    3 5
    0 6
    Output
    5
    Note

    In the first example we can choose days with numbers 2 and 4 for sell-out. In this case new numbers of products for sale would be equal to [2, 6, 2, 2] respectively. So on the first day shop will sell 1 product, on the second — 5, on the third — 2, on the fourth — 2. In total 1 + 5 + 2 + 2 = 10 product units.

    In the second example it is possible to sell 5 products, if you choose third day for sell-out.

    这个题就是n天里面找f天让商品数量*2使得最终卖出最多的东西。

    举个栗子:

    4 2

    2 1
    3 5
    2 3
    1 5

    4天里面选2天

    第一竖行是商品数量,第二竖行是顾客数量(不用管题目中的保质期(英语不好,被这个保质期搞得有点傻(/ω\)))

    第一个数据,2个商品,1个顾客,不管*2还是不*2,商品数量都比顾客数量多,没用

    第二个数据,3个商品,5个顾客,3<5,*2之后是6个商品,最后卖出去5个(因为就5个顾客)

    所以,就先把没*2的时候可以卖出去的数量先存到一个数组里,然后求和sum。

    然后再每一个数据都*2,把还可以继续卖出去的数量存到另一个数组里,然后排排坐,大的在前面,小的在后面(保证是卖出去最多的)

    之后按照要求,因为是其中f天的商品数量*2,所以把排好序的另一个数组里的前f个加到sum里,就可以了

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=1e5+10;
    struct node{
        int ss;
        int cc;
    }a[N];
    bool cmp(int a,int b){
        return a>b;
    }
    int main(){
        int b[N],c[N];
        int n,m;
        ll sum;
        while(~scanf("%d%d",&n,&m)){
            for(int i=0;i<n;i++)
                scanf("%d%d",&a[i].ss,&a[i].cc);
                for(int i=0;i<n;i++){
                    if(a[i].ss>=a[i].cc){
                        b[i]=a[i].cc;
                        c[i]=0;
                    }
                    else if((a[i].cc>a[i].ss)&&(2*a[i].ss>a[i].cc)){    //这里一开始写错了2*a[i].ss>a[i].cc写成<了
                        b[i]=a[i].ss;
                        c[i]=a[i].cc-a[i].ss;
                    }
                    else if(2*a[i].ss<=a[i].cc){
                        b[i]=a[i].ss;
                        c[i]=a[i].ss;
                    }
                }
                sort(c,c+n,cmp);
                sum=0;
                for(int i=0;i<n;i++)
                    sum+=b[i];
                for(int i=0;i<m;i++)
                    sum+=c[i];
                printf("%lld
    ",sum);
        }
        return 0;
    }
  • 相关阅读:
    数据结构(线性结构-栈)
    数据结构(线性结构-队列)
    数据结构(树状结构-二叉树)
    数据结构(树状结构-树)
    数据结构(线性结构-串)
    数据结构(堆)
    数据结构(图)
    查找(静态查找表)
    查找(动态查找表)
    查找(哈希表)
  • 原文地址:https://www.cnblogs.com/ZERO-/p/9692590.html
Copyright © 2020-2023  润新知