2070 最小罚款:

题意:初始有n元,每个任务有2个参数:t和w,<=t时刻前完成任务才可避免造成损失w。问:如何安排才能尽可能避免损失?一个任务执行时间是一个单位时间。

分析:任务按时间排个序,来一个储存每个任务w的最小堆。执行当前任务(相当于入堆),若发现执行后,时间并不超越自己的截止日期(当前时间是执行任务数,亦即当前堆size),那自然入堆,否则说明当前任务其实是不够位置放的,那么要做一个抉择:是否要保留当前任务?或者是把前面哪个要执行的任务踢出去。要踢出的自然是那个带来利益最小的了(堆顶元素)。 计算一下损失loss,n-loss即为解。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define FOR(i,a,b) for(int i=(a);i<=(b);++i)
  4. #define fi first
  5. #define se second
  6. const int maxN=1e5+,inf=0x3f3f3f3f;
  7. pair<int,int> a[];
  8.  
  9. int main () {
  10. // freopen("data.in", "r", stdin);
  11. int n, m, loss = ;
  12. scanf("%d%d", &n, &m);
  13. FOR(i, , m - ) scanf("%d", &a[i].fi);
  14. FOR(i, , m - ) scanf("%d", &a[i].se);
  15. sort(a, a + m);
  16. priority_queue<int> Q;
  17.  
  18. FOR(i, , m - ) {
  19. Q.push(-a[i].se);
  20. if ((int)Q.size() > a[i].fi) {
  21. loss += -Q.top();
  22. Q.pop();
  23. }
  24. }
  25. printf("%d\n", n - loss);
  26. return ;
  27. }

1065 最小正子段和

给一个数列,某一段连续的和为正的子序列和,称之为最小正子段和,求其最小值。

由于是连续的,容易联想到前缀和。这里:最小正子段和由于连续,所以必然是某两个前缀和之差。记Si为前i项和,对结构体{Si, i}以Si排序,那么可知,最小正子段和必然是排序后的某两相邻项之差。因为:排序后为ABC,AC能构成正子段和的话,必然BC能构成,且BC的答案比AC更优。为什么?因为若AB不能构成,而AC能构成的话,说明posA < posC,又posA>posB,所以posB <posA<posC,那么posB和posC相对关系也是合法的。另:单独的前缀和也有可能是答案。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define ll long long
  5. #define FOR(i,a,b) for(int i=(a);i<=(b);++i)
  6. int a[], n;
  7. struct node {ll s, p;} nd[];
  8. bool cmp(node a, node b) {
  9. if (a.s != b.s) return a.s < b.s;
  10. else return a.p < b.p;
  11. }
  12.  
  13. int main () {
  14. scanf("%d", &n);
  15. nd[].s = nd[].p = ;
  16. FOR(i, , n) {
  17. scanf("%d", &a[i]);
  18. nd[i].s = nd[i - ].s + a[i];
  19. nd[i].p = i;
  20. }
  21. sort(nd + , nd + + n, cmp);
  22. ll ans = 2e9;
  23. FOR(i, , n) {
  24. if (nd[i].s > ) ans = min(ans, nd[i].s);
  25. if (nd[i].p > nd[i - ].p) {
  26. ll dis = nd[i].s - nd[i - ].s;
  27. if (dis > ) ans = min(ans, dis);
  28. }
  29. }
  30. printf("%lld\n", ans);
  31. return ;
  32. }

1099 任务执行顺序

每个任务有执行空间R,执行完需存储空间O,相当于释放了R-O空间,满足R>=O,问如何排列任务能使得执行所有任务消耗的空间最少为多少?

假设有任务1和2。先执行1,那么所需空间是max(R1,O1+R2),同理若先执行2,需要max(R2,O2+R1),假设先执行1更优,即是说:

max(R1,O1+R2)<max(R2,O2+R1),那么只需满足;O1+R2<O2+R1即可。按照这个排序算一下总共需要的空间即可。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define ll long long
  5. #define FOR(i,a,b) for(int i=(a);i<=(b);++i)
  6. struct node{ll R, O;} a[];
  7. bool cmp(node a, node b){return a.O - a.R < b.O - b.R;}
  8.  
  9. int main () {
  10. // freopen("data.in", "r", stdin);
  11. int n;
  12. scanf("%d", &n);
  13. FOR(i, , n) scanf("%lld%lld", &a[i].R, &a[i].O);
  14. sort(a + , a + + n, cmp);
  15. ll ans = , cur = ;
  16. FOR(i, , n) {
  17. if (cur < a[i].R)
  18. ans += a[i].R - cur, cur = a[i].R;
  19. cur -= a[i].O;
  20. }
  21. printf("%lld\n", ans);
  22. return ;
  23. }

1449 砝码称重

现在有好多种砝码,他们的重量是w^0,w^1,w^2,.... 每种各一个。问用这些砝码能不能表示一个重量为m的东西。假设w为3,m为7,可以将重物和3放到一个托盘中,9和1放到另外一个托盘中。

可以输出YES,否则NO。相当于问是否存在两个w进制的数a和b,其中每位仅为0/1,且a和b没有相同位置的1,使得a+m=b。思路:先将m利用辗转相除法变成w进制的数字。从低到高遍历这个数字,若当前位为0 or 1,则在b的对应位放0 or 1,a处0即可,若是m对应位为w-1,即需要a在对应位来个1,使得b处变成0,且m有一个进位,若m对应位非0非1非w-1,则“NO"

比较容易理解的写法:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. ll a[];
  5. int main() {
  6. ll w,m,p=;
  7. scanf("%lld%lld", &w, &m);
  8. while (m)
  9. a[p++]=m%w, m/=w;
  10. for (int i = ; i < p; ++i) {
  11. if (a[i] == || a[i] == ) continue;
  12. if (a[i] == w - ) a[i + ]++;
  13. else {
  14. puts("NO");
  15. return ;
  16. }
  17. }
  18. puts("YES");
  19. return ;
  20. }

可以再简化,方法是一样的。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. int main () {
  5. ll w, m, t;
  6. scanf("%lld%lld", &w, &m);
  7. while (m) {
  8. t = m % w;
  9. if (t == || t == ) m = m / w;
  10. else if (t == w - ) m = m / w + ;
  11. else {
  12. puts("NO");
  13. return ;
  14. }
  15. }
  16. puts("YES");
  17. return ;
  18. }

51nod 贪心算法题集的更多相关文章

  1. 「面试高频」二叉搜索树&双指针&贪心 算法题指北

    本文将覆盖 「字符串处理」 + 「动态规划」 方面的面试算法题,文中我将给出: 面试中的题目 解题的思路 特定问题的技巧和注意事项 考察的知识点及其概念 详细的代码和解析 开始之前,我们先看下会有哪些 ...

  2. 51nod贪心算法教程

    51nod确实是一个好oj,题目质量不错,wa了还放数据,学习算法来说挺好的,这次我做了几个水的贪心,虽然水,但是确实都很典型. 教程链接:http://www.51nod.com/tutorial/ ...

  3. 51Nod 快速傅里叶变换题集选刷

    打开51Nod全部问题页面,在右边题目分类中找到快速傅里叶变换,然后按分值排序,就是本文的题目顺序. 1.大数乘法问题 这个……板子就算了吧. 2.美妙的序列问题 长度为n的排列,且满足从中间任意位置 ...

  4. 51nod贪心算法入门-----完美字符串

    约翰认为字符串的完美度等于它里面所有字母的完美度之和.每个字母的完美度可以由你来分配,不同字母的完美度不同,分别对应一个1-26之间的整数. 约翰不在乎字母大小写.(也就是说字母F和f)的完美度相同. ...

  5. KMP算法题集

    模板 caioj 1177 KMP模板 #include<bits/stdc++.h> #define REP(i, a, b) for(register int i = (a); i & ...

  6. 51nod贪心算法入门-----任务分配问题

    任务执行顺序 有N个任务需要执行,第i个任务计算时占R[i]个空间,而后会释放一部分,最后储存计算结果需要占据O[i]个空间(O[i] < R[i]). 分析: 可以抽象成,从一个整数开始,每次 ...

  7. 51nod贪心算法入门-----独木舟问题

    独木舟问题 n个人,已知每个人体重,独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人.显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟? 分析:按照 ...

  8. 51nod贪心算法入门-----活动安排问题2

    题目大意就是给几个活动,问要几个教室能够弄完. 这个题目的想法就是把活动的开始——结束的时间看做是数轴上的一段线段,教室的个数就是在某点的时间厚度,求最大的时间厚度就是所需要的教室个数. #inclu ...

  9. 51nod贪心算法入门-----活动安排问题

    有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? 输入 第1行:1个数N,线段的数量(2 <= N <= 10000) 第2 ...

随机推荐

  1. UIKit 框架之UIView二

    下面这些都是UIView一些基本的东西,具体的可以参考UIKit 框架之UIView一博客 一.自定义一个View // // MyView.m // UIView // // Created by ...

  2. Spring基础(3) : 静态工厂和实例工厂创建bean

    public class Factory { public static Person staticCreate(){ Person p = new Person(); p.name="st ...

  3. .Net下SQLite的DBHelp

    怎样获取SqLite请参考初识SqlLite ---.net连接数据库,怎样在SQLite使用Linq请参考在C#中利用Nuget包使用SQLite数据库和Linq to SQLite using S ...

  4. JS DOM操作(五) Window.docunment对象——操作元素

    定位: var a = document.getElementByIt( "id" ) 同辈元素 var b = a.nextSibling;            -- 找 a ...

  5. 入门angularJs笔记手记一

    angularjs表达式: ng-init ng-bind ng-app ng-model输入域的值绑定到程序 ng-repeat重复一个HTML元素 自定义指令: <script> va ...

  6. HDU4162(最小循环表示)

    Shape Number Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  7. HDU1281(KB10-D 二分图最大匹配)

    棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  8. Codeforces35E(扫描线)

    E. Parade time limit per test:2 seconds memory limit per test:64 megabytes input:input.txt output:ou ...

  9. JavaScript高级编程——Date类型

    JavaScript高级编程——Date类型 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" ...

  10. lamp配置多个虚拟站点

    在同一ip下添加多个域名站点! 1.查看ip 命令:ifconfig 2.添加域名 命令:vi /etc/hosts 输入域名:如 192.168.160.127   www.test.com 192 ...