51nod贪心算法教程
51nod确实是一个好oj,题目质量不错,wa了还放数据,学习算法来说挺好的,这次我做了几个水的贪心,虽然水,但是确实都很典型。
教程链接:http://www.51nod.com/tutorial/list.html
完美字符串
约翰认为字符串的完美度等于它里面所有字母的完美度之和。每个字母的完美度可以由你来分配,不同字母的完美度不同,分别对应一个1-26之间的整数。
约翰不在乎字母大小写。(也就是说字母F和f)的完美度相同。给定一个字符串,输出它的最大可能的完美度。例如:dad,你可以将26分配给d,25分配给a,这样整个字符串完美度为77。
分析: 由排序不等式,出现次数最多的字母显然应该给26。所以这个题目变成了统计每种字母出现的次数了,然后按照出现次数从大到小,依次分配从高到低的权值。这就是最朴素的贪心思想。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
#include<cctype>
#include<cstdlib>
using namespace std;
const int maxn=;
int a[maxn];
string s;
bool cmp(const int a,const int b)
{
return a>b;
}
int main()
{
while(cin>>s)
{
memset(a,,sizeof(a));
for(int i=;i<s.length();i++)
a[tolower(s[i])-'a']++;
sort(a,a+,cmp);
long long sum=;
int b=;
for(int i=;i<;i++)
{
sum+=a[i]*b;
--b;
}
cout<<sum<<endl;
}
return ;
}
活动安排问题
有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动?
分析:看似最不对的策略——结束时间越早的活动优先,才是正确的贪心。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=+;
typedef struct
{
int start;
int over;
}point;
point p[maxn];
const int cmp(const point a, const point b)
{
return a.over<=b.over;
}
int main()
{
int n;
while(cin>>n)
{
memset(p,,sizeof(p));
for(int i=;i<n;i++)
cin>>p[i].start>>p[i].over;
sort(p,p+n,cmp);
int cnt=;
for(int i=;i<n;i++)
{
for(int j=i+;j<n;j++)
{
if(p[i].over<=p[j].start)
{
i=j;
cnt++;
continue;
}
}
}
cout<<cnt<<endl;
}
return ;
}
活动安排问题二
有若干个活动,第i个开始时间和结束时间是[Si,fi),活动之间不能交叠,要把活动都安排完,至少需要几个教室?
上一题的升级版
分析:如果只需要教室的个数,我们可以把所有开始时间和结束时间排序,遇到开始时间就把厚度加1,遇到结束时间就把厚度减1,显然最初始和最后结束时的厚度是0,在一系列厚度变化的过程中,峰值(最大值)就是最多同时进行的活动数,也是我们至少需要的教室数。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=+;
int te[maxn],ts[maxn];
int main()
{
int n;
while(cin>>n)
{
for(int i=;i<n;i++)
scanf("%d%d",&ts[i],&te[i]);
sort(ts,ts+n);
sort(te,te+n);
int cnt=;
int mx=,j=;
for(int i=;i<n;i++)
{
if(ts[i]<te[j])
{
cnt++;
if(cnt>mx)
mx=cnt;
}
else if(ts[i]>te[j])
{
//cnt--;
j++;
}
else
{
j++;
}
}
cout<<mx<<endl;
}
return ;
}
独木舟问题
n个人,已知每个人体重,独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人。显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟?
分析:按照人的体重排序,最轻的人跟最重的人尽量安排在一条船上,如果超过就安排最重的
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<string>
#include<cctype>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=;
int a[maxn];
bool cmp(long long a,long long b)
{
return a>b;
}
int main()
{
int n;
long long m;
while(cin>>n)
{
scanf("%lld",&m);
long long x;
for(int i=;i<n;i++)
scanf("%lld",&a[i]);
sort(a,a+n,cmp);
long long cnt=;
int i=;
while(i<n)
{
if(a[n-]+a[i]<=m)
{
cnt++;
n--;
i++;
}
else
{
i++;
cnt++;
}
//cout<<a[i]<<"jk"<<a[n-1-i]<<endl;
}
//cout<<i<<"io"<<endl;
cout<<cnt<<endl;
}
return ;
}
任务执行顺序
有N个任务需要执行,第i个任务计算时占R[i]个空间,而后会释放一部分,最后储存计算结果需要占据O[i]个空间(O[i] < R[i])。
分析:
可以抽象成,从一个整数开始,每次减去a,再加上b (a,b都是正数),要求每次操作都不产生负数。
令a[i] = R[i], b[i] = R[i] – O[i],O[i] < R[i],有0<b[i]<a[i]。 所以尽管每次有减有加,但是加的没有减的多,总数在不断减小。所以——按照b[i]不增的顺序排序,是最“有利”的。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>
#include<vector>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=;
long long r[maxn],o[maxn],b[maxn],a[maxn];
bool cmp(long long a,long long b)
{
return a>b;
}
int main()
{
int n;
while(cin>>n)
{
for(int i=;i<n;i++)
scanf("%lld%lld",&r[i],&o[i]);
for(int i=;i<n;i++)
{
a[i]=r[i];
b[i]=r[i]-o[i];
}
sort(b,b+n,cmp);
long long mx=0x3fff;
long long ans=;
for(int i=;i<n;i++)
{
ans-=a[i];
if(ans<mx)
mx=ans;
ans+=b[i];
}
cout<<(-mx)<<endl;
}
return ;
}
51nod贪心算法教程的更多相关文章
- 51nod贪心算法入门-----完美字符串
约翰认为字符串的完美度等于它里面所有字母的完美度之和.每个字母的完美度可以由你来分配,不同字母的完美度不同,分别对应一个1-26之间的整数. 约翰不在乎字母大小写.(也就是说字母F和f)的完美度相同. ...
- 51nod贪心算法入门-----任务分配问题
任务执行顺序 有N个任务需要执行,第i个任务计算时占R[i]个空间,而后会释放一部分,最后储存计算结果需要占据O[i]个空间(O[i] < R[i]). 分析: 可以抽象成,从一个整数开始,每次 ...
- 51nod贪心算法入门-----独木舟问题
独木舟问题 n个人,已知每个人体重,独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人.显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟? 分析:按照 ...
- 51nod贪心算法入门-----活动安排问题2
题目大意就是给几个活动,问要几个教室能够弄完. 这个题目的想法就是把活动的开始——结束的时间看做是数轴上的一段线段,教室的个数就是在某点的时间厚度,求最大的时间厚度就是所需要的教室个数. #inclu ...
- 51nod贪心算法入门-----活动安排问题
有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? 输入 第1行:1个数N,线段的数量(2 <= N <= 10000) 第2 ...
- 51nod 贪心算法题集
2070 最小罚款: 题意:初始有n元,每个任务有2个参数:t和w,<=t时刻前完成任务才可避免造成损失w.问:如何安排才能尽可能避免损失?一个任务执行时间是一个单位时间. 分析:任务按时间排个 ...
- 51 Nod 1091 线段的重叠 (贪心算法)
原题链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1091 思路分析:通过读题不难发现这是一道涉及贪心算法的题,刚 ...
- 贪心算法(Greedy Algorithm)
参考: 五大常用算法之三:贪心算法 算法系列:贪心算法 贪心算法详解 从零开始学贪心算法 一.基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以 ...
- 算法导论----贪心算法,删除k个数,使剩下的数字最小
先贴问题: 1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b: 一.我的想法:先看例子:a=5476579228:去掉4位,则位数n=10,k=4, ...
随机推荐
- perfect-scrollbar示例
<!DOCTYPE html> <html> <head> <title>perfect-scrollbar - www.97zzw.com -97站长 ...
- Checking the Calendar
Checking the Calendar time limit per test 1 second memory limit per test 256 megabytes input standar ...
- php des 加密类
<?php/** *@see Yii CSecurityManager; */class Des{ public static function encrypt($data,$key){ $mo ...
- php Memcached
PHP 连接 Memcached 服务 在前面章节中我们已经介绍了如何安装 Memcached 服务,接下来我们为大家介绍 PHP 如何使用 Memcached 服务. PHP Memcache 扩展 ...
- win8.1点击“更改电脑设置”无反应(闪退)
系统:win8.1 专业版 症状:win键+C → 设置 → 更改电脑设置,无反应. 尝试办法: 1.SFC /scannow扫描修复,扫描出错误但无法修复.因为曾经为了节省空间,用DISM++清理了 ...
- Bom2016/4/21
Browser Object Model 浏览器对象模型 open(地址,打开方式) open('http://www.baidu.com','_self')本窗口打开百度 open('http:// ...
- Node.js学习 - File Operation
同步异步 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync(). 异步的方法函数最后一个参数为 ...
- CentOS添加字体
到Windows XP或者Vista下复制字体到CentOS 1.到Windows XP或者Vista下复制字体到CentOS 雅黑:msyh 黑体:SimHei 宋体:SimSun 华文细黑:STX ...
- css设置层级显示
效果: 代码: <li id="tabIdcontent4" class="nomal" tabid="content4" style ...
- Finance
转载自:http://blog.csdn.net/xiajun07061225/article/details/13346733