• Codeforces 747D:Winter Is Coming(贪心)


    http://codeforces.com/problemset/problem/747/D

    题意:有n天,k次使用冬天轮胎的机会,无限次使用夏天轮胎的机会,如果t<=0必须使用冬轮,其他随意。问最少的换胎次数。

    思路:先数冬天的天数tol,如果天数>k的话,那么就不可能度过。否则,最坏情况下,每到冬天就换一次冬天轮胎,然后度过冬天就换夏天轮胎,所以答案ans = 2*tol。然后考虑尽量让每段冬天连续,这样可以减少换胎次数,于是算出冬天之间的间隔,然后从小到大排序,每次减少一段间隔,ans就可-2。然后考虑特殊情况,如果最后一次换冬天轮胎,可以用到结束,那么ans-1。

     1 #include <cstdio>
     2 #include <algorithm>
     3 #include <iostream>
     4 #include <cstring>
     5 #include <string>
     6 #include <cmath>
     7 #include <queue>
     8 #include <vector>
     9 #include <map>
    10 #include <set>
    11 using namespace std;
    12 #define INF 0x3f3f3f3f
    13 #define N 200010
    14 typedef long long LL;
    15 vector<int> vec;
    16 int t[N];
    17 int main() {
    18     int n, k;
    19     cin >> n >> k;
    20     int tol = 0, ans = 0;
    21     int pre = -1, last = -1;
    22     for(int i = 1; i <= n; i++) {
    23         scanf("%d", &t[i]);
    24         if(t[i] < 0) {
    25             last = i; // 最后一次冬天
    26             ans += 2;
    27             tol++;
    28             if(pre != -1)
    29                 vec.push_back(i - pre - 1); // 处理冬天间隔
    30             pre = i;
    31         }
    32     }
    33 
    34     k -= tol;
    35     if(k < 0) {
    36         puts("-1");
    37     } else {
    38         sort(vec.begin(), vec.end());
    39         for(int i = 0; i < vec.size(); i++) {
    40             if(k - vec[i] >= 0) {
    41                 k -= vec[i];
    42                 ans -= 2;
    43             } else break;
    44         }
    45         if(n - last <= k) ans--;
    46         printf("%d
    ", ans);
    47     }
    48     return 0;
    49 }
  • 相关阅读:
    对话框事件
    C# 实现retry
    Linq中的group by多表多字段,Sum求和
    词干提取(stemming)和词形还原(lemmatization)
    GIT简单应用实例
    像素、分辨率、dpi的区别和联系
    二值图像、灰度图像、彩色图像
    更好的做科研
    数据挖掘竞赛利器-Stacking和Blending方式
    如何成为一名成功的博士生
  • 原文地址:https://www.cnblogs.com/fightfordream/p/6240638.html
Copyright © 2020-2023  润新知