zoukankan      html  css  js  c++  java
  • 【Luogu】【关卡2-6】贪心(2017年10月)

    任务说明:贪心就是只考虑眼前的利益。对于我们人生来说太贪是不好的,不过oi中,有时是对的。

    P1090 合并果子

    有N堆果子,只能两两合并,每合并一次消耗的体力是两堆果子的权重和,问最小消耗多少体力。

    直接贪心,每次取两堆权重最小的果子合并,注意不能在一个for循环里面sort,这样是O(N^2logN);会TLE。

    我AC的方法是第一遍sort,在循环里面用插入排序。(也有其他方法用优先队列,二叉堆什么的,不会写)

    poj有个一样的题目3253 Fence Repair。然后shi哥那本书里也有讲这个题。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <vector>
     5 #include <cstring>
     6 #include <map>
     7 #include <climits>
     8 #include <algorithm>
     9 #include <cmath>
    10 #include <sstream>
    11 
    12 using namespace std;
    13 
    14 const int INF = 1000000;
    15 /*
    16 void print(vector<int>& vec) {
    17     printf("==========begin debug========
    ");
    18     for(auto ele : vec) {
    19         printf("%d ", ele);
    20     }
    21     printf("
    
    ");
    22 }
    23 */
    24 
    25 int main() {
    26     int n;
    27     cin >> n;
    28     vector<int> vec(n);
    29     for(int i = 0; i < n; ++i) {
    30         cin >> vec[i];
    31     }
    32     long long ans = 0;
    33     //[1]快排
    34     sort(vec.begin(), vec.end());
    35     //[2]里面做插入排序
    36     for(int i = 1; i < n; ++i) {
    37         int b = vec[i-1] + vec[i];
    38         vec[i] = b, vec[i-1] = 0;
    39         ans += b;
    40         int j = i + 1;
    41         while( j < n && vec[j] <= b) {
    42             vec[j-1] = vec[j];
    43             ++j;
    44         }
    45         vec[j-1] = b;
    46         //print(vec);
    47     }
    48     cout << ans << endl;
    49 
    50     return 0;
    51 }
    View Code

    P1181 数列分段Section I

    给一个n个元素的数组,和一个数字m,问最少能把这个数组分成几段,每段的和小于等于m。

    直接贪心。

    第一次提交全WA。注意写法。这种题目一层循环就好了,写两层完全错。

    第二次提交AC了。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <vector>
     5 
     6 using namespace std;
     7 
     8 int main() {
     9     int ans = 0;
    10     int n;
    11     long long m;
    12     cin >> n >> m;
    13     vector<long long> vec(n);
    14     for(int i = 0; i < n; ++i) {
    15         cin >> vec[i];
    16     }
    17     int start = 0;
    18     long long summ = 0;
    19     for (int i = start; i < n; ++i) {
    20         if (summ + vec[i] > m) {
    21             ++ans;
    22             summ = 0;
    23             --i;
    24         } else {
    25             summ += vec[i];
    26         }
    27     }
    28     if (summ != 0) {
    29         ++ans;
    30     }
    31     cout << ans << endl;
    32     return 0;
    33 }
    View Code

    P1208 [USACO1.3]混合牛奶 Mixing Milk

    简单题直接做了

  • 相关阅读:
    SVN常用命令
    在windows下Oracle10g中创建数据库(一)
    PowerDesigner12.5 常用功能设置
    Windows下oracle xe 10g 手工创建数据库(二)
    Linux环境手动创建oracle10g数据库实践
    SQLSERVER数据库 'XX' 的事务日志已满。若要查明无法重用日志中的空间的原因,请参......
    SP中执行动态组串的sql
    手机号码吉凶测试原理计算公式
    SQL 2005 中 ROW_NUMBER 用法
    IIS 问题汇总
  • 原文地址:https://www.cnblogs.com/zhangwanying/p/7634699.html
Copyright © 2011-2022 走看看