四年前犯的错再做一遍还是会犯。
四年前不看presentation要求,四年后依然PE。
四年前忘记longlong,四年后还是会忘。

2.2 贪心法

核心思想:不断选取最优策略。

例题1-硬币:有1、5、10、50、100、500面值的硬币各c1c_1c1​、c5c_5c5​、c10c_{10}c10​、c50c_{50}c50​、c100c_{100}c100​、c500c_{500}c500​枚。需要支付A元,问最少需要硬币几枚。

解决思路:尽可能从多到少的使用硬币。

const int V[6]={1,5,10,50,100,500};
int C[6]; // 输入的硬币数量
int A;
void solve(){int ans = 0;for(int i=5; i>=0; i--){int t=min(A/V[i], C[i]);A-=t;ans+=t;}printf("%d\n", ans);
}

例题2-区间问题:有n项工作,每项分别在sis_isi​开始、在tit_iti​结束。对每项工作可以选择参与与否,如果参与必须全程参与。另外工作时间段不可重叠(时间点也不可)。目标是尽可能多地参与工作,最多能多少?

解决思路:

  1. 总是选择开始最早的工作:如果持续时间长到覆盖所有那就GG。X

  2. 总是选择时间最短的工作。X

  3. 总是选择结束最早的工作。√

const int NMAX = 100010;
int N,S[NMAX],T[NMAX];
pair<int,int> itv[NMAX];//用来排序
void solve(){for(int i=0; i<N; i++){itv[i].first = T[i];itv[i].second = S[i];}sort(itv, itv+N);int ans = 0, t = 0;for(int i=0; i<N; i++){if(itv[i].first>t){ans++;t = itv[i].first;}}printf("%d\n", ans);
}

例题3:字典序最小问题 POJ3617

给定长度为N的字符串S,要构造一个长度为N的字符串T。最初T是空串,然后反复进行下列操作:
从S头部删除一个字符,加到T尾部;
从S尾部删除一个字符,加到T尾部。

目标是构造字典序尽可能小的字符串T。
1<=N<=2000,且S只有大写英文字母。

思路:每次比较S的前后开始和末尾字母,首选小的。

但是对于字母相同的情况:我们需要比较下一个字符大小。

#include <cstdio>
#include <cstring>
using namespace std;
const int NMAX=2010;
int N;
char S[NMAX];
void solve(){int l = 0, r = N-1, cnt = 0;while(l<=r){bool lef = false;for(int i=0; l+i<=r; i++){if(S[l+i]<S[r-i]){lef = true;break;}else if(S[l+i]>S[r-i]){break;}}if(lef){putchar(S[l++]);}else{putchar(S[r--]);}cnt++;//原题中的presentation要求if(cnt%80==0)putchar('\n');}if(cnt%80)putchar('\n');
}
int main(){while(~scanf("%d",&N)){for(int i=0; i<N; i++){scanf(" %c",&S[i]);}solve();}return 0;
}

例题4: 标记最少 POJ3069

直线上有N个点,每个点位置为XiX_iXi​。
从这N个点中选出最少数量的标记点以保证:对任意点,距离R内必有标记点。
问至少要选几个点?

1<=N<=1000, 0<=R<=1000, 0<=XiX_iXi​<=1000

思路:从左往右,距离起点R范围内最右侧点做标记点,然后再往右R找到第一个不包含的点。
对于这个新点作为起点相同操作,不断重复。

#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 1011;
int N,R,X[NMAX];
void solve(){sort(X,X+N);int i = 0, ans = 0;while( i<N ){int s = X[i++];while( i<N && X[i]<=s+R ){i++;}//i跳出时是正好过了1位,因此--int p = X[i-1]; //标记点ans++;while( i<N && X[i]<=p+R ){i++;}//i跳出时正好是下个起点位置}printf("%d\n",ans);
}
int main(){while(~scanf("%d%d",&R,&N)){if(R==-1&&N==-1)break;for(int i=0; i<N; i++){scanf("%d", &X[i]);}solve();}return 0;
}

例题5 木板切割 POJ3253

将一块很长的木板切割成N块。一次切割开销等于切割后的两块木板长度和,切割过程认为没有损耗。问达成切割目标的最小开销。
1<=N<=20000, 0<=LiL_iLi​<=50000

思路:逆向考虑,就是每次合并长度最短的两块木板。

#include <cstdio>
#include <iostream>
#include <queue>
using namespace std;
typedef long long ll;
ll N, x, ans;int main(){while(~scanf("%lld",&N)){ans = 0;priority_queue<ll, vector<ll>, greater<ll> > pq;//小顶堆,默认是大顶堆for(int i=0;i<N;i++){scanf("%lld",&x);pq.push(x);}while(pq.size()>1){int now1 = pq.top();pq.pop();int now2 = pq.top();pq.pop();int nex=now1+now2;ans+=nex;pq.push(nex);}printf("%lld\n",ans);}return 0;
}

四年前犯的错再做一遍还是会犯。四年前忘记longlong,四年后还是会忘。

【挑战程序设计竞赛】- 2.2贪心法(硬币最少、区间覆盖、字典序最小、标记最少、木板切割)相关推荐

  1. 《挑战程序设计竞赛》--初级篇习题POJ部分【穷竭搜索+贪心】

    最近看了<挑战程序设计竞赛>初级篇,这里总结一下部分poj上的练习题,主要涉及方面为: 穷竭搜索 and 贪心算法 具体题目: 简单导航 一.穷竭搜索 二.贪心算法 一.穷竭搜索 穷竭搜索 ...

  2. 挑战程序设计竞赛(第2版)》

    <挑战程序设计竞赛(第2版)> 基本信息 作者: (日)秋叶拓哉 岩田阳一 北川宜稔 译者: 巫泽俊 庄俊元 李津羽 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787 ...

  3. 《挑战程序设计竞赛》--初级篇习题POJ部分【动态规划】

    关于基本的动态规划和经典的动态规划,在之前已经总结过了,可以温习一下: 传送门 这次是延续上次的<挑战程序设计竞赛>初级篇,总结部分poj上的练习题,主要是DP方面的练习题: 一.基础的动 ...

  4. 《挑战程序设计竞赛(第2版)》习题册攻略

    本项目来源于GitHub 链接: 项目GitHub链接 1 前言 项目为<挑战程序设计竞赛(第2版)>习题册攻略,已完结.可配合书籍或笔记,系统学习算法. 题量:约200道,代码注释内含详 ...

  5. ICPC程序设计题解书籍系列之三:秋田拓哉:《挑战程序设计竞赛》(第2版)

    白书<挑战程序设计竞赛>(第2版)题目一览 白书:秋田拓哉:<挑战程序设计竞赛>(第2版) 第1章 蓄势待发--准备篇(例题) POJ1852 UVa10714 ZOJ2376 ...

  6. 《挑战程序设计竞赛》 读后感(转载)

    <挑战程序设计竞赛> 读后感 最近要开始准备面试找工作,算法是准备的重中之重,舍友推荐了<挑战程序设计竞赛>这本书.花了一周的时间大体过了一遍,该书真切地让我理解了" ...

  7. 挑战程序设计竞赛(第二章习题总结)

    文章目录 搜索 Curling 2.0(POJ 3009) Meteor Shower(POJ 3669) Smallest Difference(POJ 2718) Hopscotch(POJ 30 ...

  8. 《挑战程序设计竞赛》--初级篇习题POJ部分【2.4 - 2.6】

    这次是延续上次的<挑战程序设计竞赛>初级篇,总结部分poj上的练习题,主要是2.4 ~ 2.6部分: 导航 2.4 加工并存储的数据结构 优先队列 Sunscreen MooUnivers ...

  9. 【操作指导 | 代码实现】挑战程序设计竞赛2:算法和数据结构

    书籍封面 第一章 前言 1. 本人衷心建议 ~~~~~~       如果你是一位初学者,我指的是你只会基本的 C/C++ 编程,即使编的很烂,这本书对于你算法和数据结构的提升非常有帮助,所涉及的每一 ...

  10. 挑战程序设计竞赛书的题解总结(连载中)

    写在前面的话(前言) 每天无所事事真是无趣啊,作为一个将来要征战acm的优秀青年,我感到有刷点什么的必要了! 毕竟同级的acm大佬们真是太强了,跟着老师走肯定会一直被暴打下去..去oj上刷题呢,又感觉 ...

最新文章

  1. java版b2b2c社交电商springcloud分布式微服务 (九)服务链路追踪(Spring Cloud Sleuth)...
  2. IQ推理:红眼睛和蓝眼睛
  3. IOS开发--TextField
  4. audio 标签简介
  5. Oracle数据库中的dual表
  6. minion java上传文件_Java程序员如何快速理解Kubernetes
  7. php 文件上传mime 类型,PHP JAVA C上传文件如何准确判断文件类型-mime知识普及
  8. 实战爬虫-爬取红袖添香并存入数据库
  9. 网络分解的时代即将到来,云服务商正在铺路 | 分析师洞察
  10. js使用闭包循环为a标签正确添加事件
  11. android wp主题,WP主题:ebou4
  12. 苹果笔记本摄像头黑屏怎么回事
  13. DM642的PCI驱动编程笔记:缺页中断问题阐述以及与改变中断级相关的内核函数
  14. python中的魔法方法__new___Python魔法方法会调用new方法吗?
  15. 【教程】如何导入批量加海外号码到手机通讯录加whatsApp和line
  16. 别整天 “学妹/前女友”了,花2小时整理了Numpy测试习题100道,做个测验吧!
  17. Mavlink协议概要
  18. 基于VHDL移位寄存器程序设计
  19. 每个人心中都是有那一颗朱砂痣,不是美人却是美食
  20. 03-若依-数据库表分析

热门文章

  1. 【Linux系统移植】NXP 官方开发板 kernel内核 编译与烧录
  2. 高数数学——多元函数微分学
  3. 光传输-SDH技术总结
  4. Java 复杂表头、表格导出 - EasyExcel
  5. android 输入模糊匹配_Android通讯录模糊匹配,搜索实现高亮关键字(号码、首字母、简拼、全拼)...
  6. NewMark法求解动力学响应
  7. 显示器花屏故障分析与排除
  8. MeeGo编译步骤参考
  9. JAVA计算机毕业设计网上购物商城(附源码、数据库)
  10. SCORM标准课件制作