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贪心算法教程的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 51nod 贪心算法题集

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

  7. 51 Nod 1091 线段的重叠 (贪心算法)

    原题链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1091 思路分析:通过读题不难发现这是一道涉及贪心算法的题,刚 ...

  8. 贪心算法(Greedy Algorithm)

    参考: 五大常用算法之三:贪心算法 算法系列:贪心算法 贪心算法详解 从零开始学贪心算法 一.基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以 ...

  9. 算法导论----贪心算法,删除k个数,使剩下的数字最小

    先贴问题: 1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b: 一.我的想法:先看例子:a=5476579228:去掉4位,则位数n=10,k=4, ...

随机推荐

  1. Clock Pictures

    Clock Pictures 题目描述 You have two pictures of an unusual kind of clock. The clock has n hands, each h ...

  2. HDOJ3743<分治>

    题意:求一个排列的逆序数. #include<cstdio> #include<iostream> #include<algorithm> const int ma ...

  3. UIImagePikerController 浅析

    原文链接:http://www.jianshu.com/p/2ac85aca4468 UIImagePickerController是iOS系统提供的和系统的相册和相机交互的一个类,可以用来获取相册的 ...

  4. 为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口

    在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接 口.实现这两者的目的是为了向更上一层提供硬件访问接口,即 ...

  5. 通过intent启动Activity

    android应用程序内部通过Intent来实现Activity间的跳转.也知道通过Intent调用系统程序.但若想在应用程序A内开启应用程序B(前提是A.B均已安装),该如何去实现? 记录下实现过程 ...

  6. parseint和parsefloat总结number。隐形转换

    parseint:会认识一些字符+.-.空格,其他的就会截止譬如23hudhchauch结果为:23,对于boollen类型不能转换为1或是0. number:是对整体的转换.对true的转换为1. ...

  7. 学习笔记——门面模式Facade

    门面模式,其实在我们不经意间已经使用了此设计模式.当我们需要将两个子系统,合并对外提供一个大的接口时,我们使用的就是门面模式.对外,子系统的接口是不可见的,只有我们的门面在.

  8. ARP及RARP简介

    1.概念 ARP(Address Resolution Protocol) 地址解析协议 RARP(Reverse Address Resolution Protocol) 反向地址解析协议 2.AR ...

  9. 困扰你的private static final long serialVersionUID

    很多时候一个新手在写代码的时候,往往你的IDE就会告诉你一个警告 然后你点击处理这个警告之后,它就会默认给你的类生成一个 private static final long serialVersion ...

  10. linux中服务器定时程序设定

    服务器不重启的情况下定时自动重启apache及mysql服务,其实也大同小异.具体步骤如下:  一.每天的12点及16点重启apache及mysql服务 [root@www bin]# cd /opt ...