• codeforces 747D. Winter Is Coming(贪心)


    题目链接:http://codeforces.com/problemset/problem/747/D

    题意:冬天有n天,冬天用的轮胎总共能用k天,一开始车子用的是夏天的轮胎。

    给出n天的平均气温,温度小于0的时候必须换上冬天用的轮胎,冬天用的轮胎

    任何温度下都可以使用,问最少交换机次轮胎。

    首先要找到第一个温度小于0的日子,那天肯定要换上冬天用的轮胎,然后再找

    最后一个温度小于0的日子,因为在那之后就用不到冬天用的轮胎了。设最早小

    于0的日子为sta,最后为end。

    大情况稍微分一下

    设温度小于0的天数为count

    1)count = 0

    输出0.

    2)count > k

    输出-1

    3)0 < count <= k 时要分多种情况。

    1.k >= n - sta + 1

    输出1

    2.sta - end + 1 <= k < n - sta + 1

    输出2

    3.k < sta - end + 1

    这是要考虑如何在sta~end区间的换一下夏天用的轮胎来为冬天的轮胎续一下。

    于是我们可以找sta~end之间的大于0的区间交换2次,由于我们要尽可能的少

    的交换轮胎,所以我们可以找尽可能区间长的区间来换这样省了冬天轮胎使用的

    天数,这里设sta~end之间减去删掉的区间总长度剩下的长度为gg,gg<=k时

    就可以不用再减了,end~n的这段时间在比较一下gg+n-end与k。

    1)).gg + n - end >= k

    不用再加了。

    2)).gg + n - end < k

    再加一次

    最后输出天数即可

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int M = 2e5 + 10;
    int a[M] , b[M];
    bool cmp(int x , int y) {
        return x > y;
    }
    int main() {
        int n , k;
        cin >> n >> k;
        int count = 0;
        for(int i = 1 ; i <= n ; i++) {
            cin >> a[i];
            if(a[i] < 0) {
                count++;
            }
        }
        if(count > k) {
            cout << -1 << endl;
        }
        else {
            int sta = 1 , end = n;
            for(int i = 1 ; i <= n ; i++) {
                sta = i;
                if(a[i] < 0) {
                    break;
                }
            }
            for(int i = n ; i >= 1 ; i--) {
                end = i;
                if(a[i] < 0) {
                    end = i;
                    break;
                }
            }
            if(sta > end || count == 0) {
                cout << 0 << endl;
            }
            else {
                int cnt = end - sta + 1;
                int temp = 0;
                int sum = 0;
                for(int i = sta ; i <= end ; i++) {
                    if(a[i] < 0 && sum > 0) {
                        b[temp++] = sum;
                        sum = 0;
                    }
                    if(a[i] >= 0) {
                        sum++;
                    }
                }
                sort(b , b + temp , cmp);
                if(cnt > k) {
                    int gg = cnt;
                    int num = 0;
                    for(int i = 0 ; i < temp ; i++) {
                        gg -= b[i];
                        num++;
                        if(gg <= k)
                            break;
                    }
                    gg += (n - end);
                    if(gg > k) {
                        cout << 2 + num * 2 << endl;
                    }
                    else {
                        cout << 1 + num * 2 << endl;
                    }
                }
                else {
                    if(k >= n - sta + 1) {
                        cout << 1 << endl;
                    }
                    else {
                        cout << 2 << endl;
                    }
                }
            }
        }
        return 0;
    }
    
  • 相关阅读:
    JS定时刷新页面及跳转页面
    javascript 使用btoa和atob来进行Base64转码和解码
    浏览器好玩的的 console.log
    Jmeter(二十三)Jmeter-Question之“批量造数据”
    性能测试---开发世界的狂野一面
    Jmeter(二十二)Jmeter-Question之“不同线程组之间传递变量”
    Jmeter(二十一)Jmeter常见问题及场景应用
    Jmeter(二十)Beanshell or JSR223
    Jmeter(十九)Logic Controllers 之 Module Controller and Include Controller
    Jmeter(十八)Logic Controllers 之 Random Controller and Random order Controller
  • 原文地址:https://www.cnblogs.com/TnT2333333/p/6260450.html
Copyright © 2020-2023  润新知