《挑战程序设计竞赛》2.2 贪心法-其它 POJ3617 3069 3253 2393 1017 3040 1862 3262

POJ3617

Best Cow Line

题意

给定长度为N的字符串S,要构造一个长度为N的字符串T。起初,T是一个空串,随后反复进行下列任意操作:
从S的头部(或尾部)删除一个字符,加到T的尾部
目标是构造字典序尽可能小的字符串T。

思路

贪心算法,不断取S的开头和末尾中较小的一个字符放到T的末尾。但对于S的开头和末尾字符相同的情况下,需要比较下一个字符大小,这可以用如下算法实现:
按照字典序比较S和S翻转后的字符串S1,如果S较小,则从S的开头取,否则从末尾取。

代码

Source CodeProblem: 3617       User: liangrx06
Memory: 728K        Time: 47MS
Language: G++       Result: Accepted
Source Code
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;#define N 2000int main(void)
{int n, i, j, k, ii, jj;char s[N+1], t[N+1];while (cin >> n){for (i=0; i<n; i++) {getchar();scanf("%c", &s[i]);}s[i] = '\0';i = 0;j = n-1;k = 0;while (i <= j) {ii = i, jj = j;while (ii <= jj) {if (s[ii] != s[jj])break;ii ++;jj --;}if (ii <= jj && s[ii] > s[jj]) {t[k++] = s[j];j --;}else {t[k++] = s[i];i ++;}}t[k] = '\0';for (i = 0; i < n; i++){printf("%c", t[i]);if (i % 80 == 79) printf("\n");}if (n % 80) printf("\n");}return 0;
}

POJ3069

Saruman’s Army

题意

这个题是说给你n个点,然后让你标记其中尽可能少的点,使得n个点都处于被标记点左右不超过R的区间内。

思路

贪心法求解,从左到右选择。

代码

Source CodeProblem: 3069       User: liangrx06
Memory: 748K        Time: 125MS
Language: G++       Result: Accepted
Source Code
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;#define N 1000int main(void)
{int r, n, i, j;int pos[N], res;while (cin >> r >> n) {if (r == -1 && n == -1)break;for (i=0; i<n; i++)cin >> pos[i];sort(pos, pos+n);res = 0;i = 0;while (i < n) {j = i+1;while (j < n && pos[j] - pos[i] <= r)j ++;j --;i = j+1;while (i < n && pos[i] - pos[j] <= r)i ++;res ++;}cout << res << endl;}return 0;
}

POJ3253

Fence Repair

题意

有一个农夫要把一个木板钜成几块给定长度的小木板,每次锯都要收取一定费用,这个费用就是当前锯的这个木版的长度。给定各个要求的小木板的长度,及小木板的个数n,求最小费用。
提示:

3
5 8 5
为例:
先从无限长的木板上锯下长度为 21 的木板,花费 21
再从长度为21的木板上锯下长度为5的木板,花费5
再从长度为16的木板上锯下长度为8的木板,花费8
总花费 = 21+5+8 =34

思路

利用Huffman思想,要使总费用最小,那么每次只选取最小长度的两块木板相加,再把这些“和”累加到总费用中即可
本题虽然利用了Huffman思想,但是直接用HuffmanTree做会超时,可以用优先队列做

代码

Source CodeProblem: 3253       User: liangrx06
Memory: 1184K       Time: 219MS
Language: C++       Result: Accepted
Source Code
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <set>
using namespace std;int main(void)
{int n, i;long long x, sum;multiset <long long> plank;while (cin >> n){for (i=0; i<n; i++) {cin >> x;plank.insert(x);}sum = 0;while (plank.size() > 1){x = *(plank.begin()) + *(++plank.begin());sum += x;plank.erase(plank.begin());plank.erase(plank.begin());plank.insert(x);}cout << sum << endl;plank.clear();}return 0;
}

POJ2393

Yogurt factory

题意

有n周,第i周:需要向外供货yi,生产1单位成本ci。若非本周生产的货物不在本周销售,需要贮藏,1单位贮藏一周需要花费s。问n周供货供需花费多少钱(成本和贮藏费)。

思路

贪心,我们用minc记录当前的最小单价,然后以最小单价买入,这个最小单价,要么是现在的单价,要么是之前的最小单价+贮藏费。minc中被替换掉的值是不可能是以后的最小单价的。因为现在被替换,同时+上若干个s之后它还是会比现在替换它的那个值大。

代码

Source CodeProblem: 2393       User: liangrx06
Memory: 132K        Time: 16MS
Language: C++       Result: Accepted
Source Code
#include<iostream>
using namespace std;int main()
{int n, s, minc = 9999;scanf("%d %d", &n, &s);long long sum = 0;while(n --){int c, y;scanf("%d %d", &c, &y);if(c > minc + s)c = minc + s;minc = c;sum += c * y;}printf("%lld\n", sum);return 0;
}

POJ1017

Packets

题意

问题描述
一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个
型号,他们的长宽分别为 1*1, 2*2, 3*3, 4*4, 5*5, 6*6. 这些产品通常使用一个 6*6*h
的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的
包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由
你来设计。
输入数据
输入文件包括几行,每一行代表一个订单。每个订单里的一行包括六个整数,中间用空
格隔开,分别为 1*1 至6*6 这六种产品的数量。输入文件将以 6 个0 组成的一行结尾。
输出要求
除了输入的最后一行6 个0 以外,输入文件里每一行对应着输出文件的一行,每一行输
出一个整数代表对应的订单所需的最小包裹数。
输入样例
0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0
输出样例
2
1

思路

这个问题描述得比较清楚,我们在这里只解释一下输入输出样例:共有两组有效输入, 第一组表示有4 个3*3 的产品和一个6*6 的产品,此时4 个 3*3 的产品占用一个箱子,另外 一个 6*6 的产品占用 1 个箱子,所以箱子数是 2;第二组表示有7 个 1*1 的产品,5 个 2*2 的产品和1 个 3*3 的产品,我们可以把他们统统放在一个箱子中,所以输出是1。
分析六个型号的产品占用箱子的具体情况如下:6*6的产品每个会占用一个完整的箱 子,并且没有空余空间;5*5 的产品每个占用一个新的箱子,并且留下 11 个可以盛放 1*1 的产品的空余空间;4*4 的产品每个占用一个新的箱子,并且留下5 个可以盛放2*2 的产品 的空余空间;3*3 的产品情况比较复杂,首先3*3 的产品不能放在原来盛有5*5 或者4*4 的箱子中,那么必须为3*3 的产品另开新的箱子,新开的箱子数目等于3*3 的产品的数目除以 4 向上取整;同时我们需要讨论为3*3 的产品新开箱子时,剩余的空间可以盛放多少2*2 和 1*1 的产品(这里如果有空间可以盛放2*2 的产品,我们就将它计入2*2 的空余空间,等到 2*2 的产品全部装完,如果还有2*2 的空间剩余,再将它们转换成 1*1 的剩余空间)。我们 可以分情况讨论为3*3 的产品打开的新箱子中剩余的空位,共为四种情况:第一种,3*3 的 产品的数目正好是4 的倍数,所以没有空余空间;第二种,3*3 的产品数目是4 的倍数加1, 这时还剩 5 个2*2 的空位和7 个 1*1 的空位;第三种,3*3 的产品数目是4 的倍数加2,这时还剩3 个2*2 的空位和6 个 1*1 的空位;第四种,3*3 的产品数目是4的倍数加3,这时 还剩 1 个 2*2 的空位和5 个 1*1 的空位;处理完3*3 的产品,就可以比较一下剩余的2*2 的空位和2*2 产品的数目,如果产品数目多,就将2*2 的空位全部填满,再为2*2 的产品打开新箱子,同时计算新箱子中 1*1 的空位,如果剩余空位多,就将2*2 的产品全部填入2*2的空位,再将剩余的 2*2 的空位转换成 1*1 的空位;最后处理 1*1 的产品,比较一下 1*1的空位与1*1 的产品数目,如果空位多,将1*1 的产品全部填入空位,否则,先将1*1 的空位填满,然后再为 1*1 的产品打开新的箱子。

代码

Source CodeProblem: 1017       User: liangrx06
Memory: 132K        Time: 16MS
Language: C++       Result: Accepted
Source Code
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;bool input(int a[])
{bool flag = false;for (int i = 1; i <= 6; i ++) {scanf("%d", &a[i]);if (a[i] != 0) flag = true;}return flag;
}int main(void)
{int a[7];int i, k, m, res;while (input(a)) {res = 0;for (i = 6; i >= 1; i --) {k = (6/i)*(6/i);//每个包裹能放的第i个产品的数量m = a[i]/k;//需要的包裹数量a[i] %= k;int n1 = 6*6*m - i*i*m*k;//剩下多少个1*1if (a[i]) n1 += 6*6 - i*i*a[i];if (i == 3 || i == 4) {int n2 = 0;//剩下多少个2*2if (i == 4)n2 += 5*m;else if (i == 3 && a[i])n2 += (4-a[i])*2 - 1;if (n2 > a[2])n2 = a[2];a[2] -= n2;//printf("n1=%d, n2=%d\n", n1, n2);n1 -= 2*2*n2;//printf("n1=%d, n2=%d\n", n1, n2);}if ( i >= 2 && i <= 5 ) {if (n1 > a[1])n1 = a[1];a[1] -= n1;}//for (int x = 1; x <= 6; x ++)//  printf("%d ", a[x]);//printf("\n");res += m;if (a[i])res ++;a[i] = 0;}printf("%d\n", res);}return 0;
}

POJ3040

Allowance

题意

有N种不同面额的纸币,你雇佣的一个人,每次支付至少C圆。每种纸币的面额大小为V(每种纸币的大小成整倍数关系这是结题的关键),张数为B,问你最多能支付多少次?

思路

将V从小到大进行一个排列

1.先把大于C元的纸币用了,进行一个计数

2.再从大的纸币进行抓取,抓得越多越好,但要小于等于C,如果等于C进行一个计数,如果小于C,再将纸币从小的抓取,大于C进行一个计数。因为纸币是成倍数关系的,你最大的纸币面额,比前面所有纸币面额加起来都大。

3.最后进行一个支付情况的总加,意思是,你后面还能像这第2步这样支付方案的个数,然后再从第2步开始,直到不能支付。

代码

Source CodeProblem: 3040       User: liangrx06
Memory: 212K        Time: 16MS
Language: C++       Result: Accepted
Source Code
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;const int N = 20;struct Coin {int v, b;
};bool cmp(const Coin &x, const Coin &y)
{return x.v < y.v;
}int n, c;
int m[N];
Coin coin[N];int sum;
bool choose(int i)
{m[i] = sum / coin[i].v;if (m[i] > coin[i].b)m[i] = coin[i].b;sum -= m[i]*coin[i].v;if (sum == 0)return true;if (i == 0 || choose(i-1) == false) {if (coin[i].b > m[i]) {sum -= coin[i].v;m[i] ++;return (sum <= 0);}return false;}return true;
}bool canPay()
{memset(m, 0, sizeof(m));sum = c;return choose(n-1);
}int main(void)
{int i;cin >> n >> c;for (i = 0; i < n; i ++)cin >> coin[i].v >> coin[i].b;sort(coin, coin+n, cmp);int res = 0;while (canPay()) {int k = (int)1e9;//for (i = 0; i < n; i ++)//  printf("%d ", m[i]);//printf("\n");for (i = 0; i < n; i ++) {if (m[i] > 0) {int t = coin[i].b / m[i];k = (t < k) ? t : k;}}for (i = 0; i < n; i ++) {if (m[i] > 0) {coin[i].b -= m[i] * k;}}res += k;//break;}printf("%d\n", res);return 0;
}

POJ1862

Stripies

题意

科学家发现一种奇怪的玩意,他们有重量weight,如果他们碰在一起,总重变成2*sqrt(m1*m2)。要求出最终的重量的最小值。

思路

试一下就可以发现:对重量较大的先碰,可以对其多次sqrt,使得最后的结果最小。

代码

Source CodeProblem: 1862       User: liangrx06
Memory: 220K        Time: 16MS
Language: C++       Result: Accepted
Source Code
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;const int N = 10000;int n;
double a[N];void input()
{cin >> n;for (int i = 0; i < n; i ++) {cin >> a[i];}
}double coll(double x, double y)
{return 2*sqrt(x*y);
}double solve()
{sort(a, a+n);for (int i = n-2; i >= 0; i --)a[i] = coll(a[i], a[i+1]);return a[0];
}int main(void)
{input();double res = solve();printf("%.3lf\n", res);return 0;
}

POJ3262

Protecting the Flowers

题意

有n个牛在FJ的花园乱吃。
所以FJ要赶他们回牛棚。
每个牛在被赶走之前每秒吃Di个花朵。赶它回去FJ来回要花的总时间是Ti×2。在被赶走的过程中,被赶走的牛就不能乱吃。

思路

贪心策略,对牛进行排序,排序的标准是,假设牛A与牛B要选一头赶走,我们首先要选择破坏最大的一头牛赶走,留破坏小的牛。他们的破坏着呢麽计算呢?假设先赶走牛A,那么牛B造成的损失是2×TA×DB,先赶走牛B,那么牛A造成的损失是2×TA×DB,所以,只要判断TA×DB与TA×DB谁大,就知道该先赶走谁了,所以数组排序的标准就是—Ti×Dj>Tj×Di。

代码

Source CodeProblem: 3262       User: liangrx06
Memory: 1780K       Time: 141MS
Language: C++       Result: Accepted
Source Code
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;const int N = 100000;struct Cow {int t, d;double v;
};int n;
Cow cow[N];void input()
{cin >> n;for (int i = 0; i < n; i ++) {scanf("%d%d", &cow[i].t, &cow[i].d);cow[i].v = (double)(cow[i].d)/(double)(cow[i].t);}
}bool cmp(const Cow &x, const Cow &y)
{return x.v > y.v;
}void solve()
{sort(cow, cow+n, cmp);long long res = 0;int time = 0;res += time * cow[0].d;for (int i = 1; i < n; i ++) {time += 2*cow[i-1].t;res += time * cow[i].d;}printf("%lld\n", res);
}int main(void)
{input();solve();return 0;
}

转载于:https://www.cnblogs.com/liangrx06/p/5083767.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

easyui dialog的一个小坑

问题描述&#xff1a;1、html<div id"dig" style"padding:10px;width:500px;height:300px;font-family:微软雅黑;font-size:16px;"> Dialog Content. </div> 2、js$("#dig").css("display", "block");$(#dig).d…

android rxbus 一个页面监听,Android RxBus的使用

RxBus的核心功能是基于Rxjava的&#xff0c;在RxJava中有个Subject类&#xff0c;它继承Observable类&#xff0c;同时实现了Observer接口&#xff0c;因此Subject可以同时担当订阅者和被订阅者的角色&#xff0c;这里我们使用Subject的子类PublishSubject来创建一个Subject对象…

AngularJS $q

updatePushIdfunction($q,pushid) { var d$q.defer(); var data {pushid:pushid}; server.api("/updateRId",data).success(function(res){ if(res.resultcode1){ d.resolve(更新成功.);…

C# 如何转换生成长整型的时间

这个数字字符串就是我们平常所说的时间戳。什么是时间戳&#xff1f;时间戳&#xff08;timestamp&#xff09;&#xff0c;通常是一个字符序列&#xff0c;唯一地标识某一刻的时间。时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至…

html自动滑动轮播代码,html+css+js 实现自动滑动轮播图

轮播图*{margin: 0 auto;padding: 0;list-style: none; //去圆点}.one {width: 1200px;height:350px;margin: 0 auto;overflow: hidden; //设定好的宽度多余的进行隐藏}.one ul{width: 3600px;position: relative;}.one ul li{float: left; //图片浮动}.two ul li { …

程序员必定会爱上的10款软件

目录 第一款&#xff1a;TrueCrypt 第二款&#xff1a;Soureinsight 第三款&#xff1a;Sublime 第四款&#xff1a;Mindmanager 第五款&#xff1a;MarkdownPad 第六款&#xff1a;Beyond compare 第七款&#xff1a;Vim 第八款&#xff1a;Wireshark 第九款&#xff1a;Fiddl…

html定义字体纵向对齐,HTML5 Canvas的文本如何实现垂直对齐

垂直对齐&#xff0c;使用CSS很容易实现&#xff0c;如果想在HTML5 Canvas中实现垂直对齐&#xff0c;如何设置呢&#xff0c;这就是今天要分享的笔记。HTML画布垂直对齐的文本&#xff0c;我们可以使用的textBaseline在画布范围内的属性值。textBaseline可以设置以下值之一 &a…

深度学习方法:受限玻尔兹曼机RBM(三)模型求解,Gibbs sampling

欢迎转载&#xff0c;转载请注明&#xff1a;本文出自Bin的专栏blog.csdn.net/xbinworld。 技术交流QQ群&#xff1a;433250724&#xff0c;欢迎对算法、技术、应用感兴趣的同学加入。 接下来重点讲一下RBM模型求解方法&#xff0c;其实用的依然是梯度优化方法&#xff0c;但是…

推荐一款PC端的远程软件-Remote Utilities

远程控制软件非常之多&#xff0c;但小编自己用过的就那么3个&#xff1a;teamviewer&#xff1a;在家远程办公时基本上都靠它连回公司的电脑&#xff0c;速度快、稳定、不需要公网IP。vnc&#xff1a;要开启vpn才能连回公司的网络&#xff0c;速度够快。系统自带远程桌面&…

原生js追加html代码,原生js实现给指定元素的后面追加内容

复制代码 代码如下:var header1 document.getElementById("header");var p document.createElement("p"); // 创建一个元素节点insertAfter(p,header1); // 因为js没有直接追加到指定元素后面的方法 所以要自己创建一个方法function insertAfter( newEle…

这些才是Win10真正好用之处:瞬对Win7无爱

自从将家里的笔电、台式机全部升级到Win10之后&#xff0c;小编可是切切实实感受到了它的强大&#xff0c;非常多的改进、非常多人性化的设计。和之前的测试版不同&#xff0c;作为主力系统后自然要匹配日常的工作。很多设置、操作也要顺应以前的使用习惯。经过这几天折腾&…

html5 保存 搜索历史,html5 – 如何有效处理Dart中的浏览器历史记录(即后退按钮)?...

HTML5定义了用于操作历史记录的新API,允许您在不重新加载窗口的情况下更改位置.有一篇关于Dive Into HTML5的精彩文章,展示了如何使用历史API在单页面应用中模拟多页面导航.它很容易翻译成Dart.在带导航的单页应用程序中,我通常设置客户端代码的方式类似于在服务器上设置RoR或D…

多个DataSet数据合并

DataSet ds myIAppSet.GetHomeHottestList(siteID, 0, time); DataSet ds1 myIAppSet.GetHomeHottestList(siteID, 1, time);if (ds1 ! null && ds1.Tables[0].Rows.Count > 0){ds.Merge(ds1);} Merge方法&#xff0c;用于DataSet、DataTable&#xff0c;多个字段…

math.js:灵活强大的JavaScript数学库

最近为期权开发一些基本技术指标&#xff0c;用到一些C的数学库&#xff0c;刚好看到JavaScript的math.js库&#xff0c;这里对math.js做一下简单介绍。一、什么是math.jsmath.js是一个广泛应用于JavaScript 和 Node.js的数学库&#xff0c;它的特点是灵活表达式解析器&#xf…

html的闪烁字,HTML最简单的文字闪烁代码

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Titlekeyframes blink{0%{opacity: 1;}50%{opacity: 1;}50.01%{opacity: 0;}100%{opacity: 0;}}-webkit-keyframes blink {0% { opacity: 1; }50% { opacity: 1; }50.01% { opacity: 0; }100% { opacity: 0; }}-moz-keyframes blin…

video和dvd audio区别:

VIDEO 是视频&#xff0c;AUDIO是音频。DVD- Audio 是目前流行的DVD光碟格式的一种扩展&#xff0c;区别在于它能够传输先前所有音频载体格式无法携带的全新标准的高质量音频数据。最引人注目的特点是它多声道音频的能力。转载于:https://www.cnblogs.com/zjqqqq/p/5060931.htm…

Win10非常好用的6个使用技巧

很多人已经用上了Win10系统&#xff0c;为了提高使用效率掌握使用技巧尤为重要&#xff0c;今天我为大家分享win10的6个使用技巧。第一个&#xff1a;快速查找文件&#xff08;win键E&#xff09;想要打开某个文件&#xff0c;直接使用这个快捷键就可以打开资源管理器&#xff…

servlet html登录,Servlet实现用户登录

1、登录过程分析&#xff1a;通过表单收集用户的数据&#xff0c;Servlet通过request对象获得用户提交的数据&#xff0c;服务器还需要从数据库中通过sql语句查询有没有表单提交的数据中的用户。有则登录成功&#xff0c;否则&#xff0c;登录失败。2、工程结构&#xff1a;3、…

HTML5拖放API

HTML5拖放API 拖放事件 HTML5拖放API 拖放事件事件提供了拖放可以控制几乎所有方面的拖放操作。棘手的部分是确定每个事件触发&#xff1a;在拖项目火&#xff1b;别人火下降的目标。 拖动项时&#xff0c;以下事件&#xff08;按照这个顺序&#xff09;&#xff1a;拖曳开始拖…

C#easyui combotree 设置节点折叠

树实体public class Combotree{public string id { get; set; }public string text { get; set; }public string state { get; set; }public List<Combotree> children { get; set; }} 只需要在初始化数据的时候给state 设置为 closed注意&#xff1a;不要在最后一级节点…