noip推荐系列:汽艇[贪心]

【问题背景】

  一天sxc,zsx,wl到gly坐汽艇,本来和其他的人约好了一起去,结果被放了鸽子,3人便只有一人负担x元去坐汽艇(很贵哦)。坐了才发现如果汽艇上人多了位置就不宽敞,就不好玩了。而3个人貌似是最好玩的,但究竟是不是呢?

【问题描述】    假设有n个人要去坐1个汽艇,每个人单独坐汽艇的快乐程度是Ci,每多一个人,他的快乐程度会减去Di,请求出使快乐程度之和达到最大的方案。(假设汽艇的容量足够大)。

【文件输入】

  输入文件共有3行:    第1行是一个整数n;    第2行有n个整数,依次表示每个人单独坐汽艇的快乐程度Ci(1<=Ci<=10000);    第3行有n个整数,依次表示每多1人,每个人快乐程度的下降值Di(1<=Di<=10)。

【文件输出】

  应输出两行:    第1行一个整数,是最大的快乐程度之和;    第2行一个整数,是最大的快乐程度之和所对应的汽艇上的人数(若有多种方案,则输出人数最多的)。

【样例输入】

6

10 10 10 10 10 9

2 2 2 2 2 3

【样例输出】

18

3

【样例说明】    前3个人去坐汽艇可使快乐程度之和达到最大,每个人的快乐程度均为10-2*2=6,总和是18。

【数据范围】    对于30%的数据,n<=20;    对于100%的数据,n<=1000。

这样的题很容易可以判断出是贪心,DP不行,因为这题要考虑后效性;(而且个人感觉暴力都不好写)

但是怎么贪心?

这题我第一测的时候全WA= =,或许是因为写贪心已经形成一种定式了吧,总想着先排序,然后再乱搞什么的。

所以这题也算是给我一个教训吧

说说这题的思路吧

首先,我们不可以一下子判断出来选谁最优对吧

因为快乐值大的,下降值可有可能很大。同理。

所以,我们每选一次就判断一次谁最优;

其实很简单...(我比较傻逼没有想到)

不过就是模拟+贪心思想;

我们枚举坐汽艇的人数i,算出在当前人数i下,每一个人剩下的快乐程度,排序,算出i人最大的快乐程度总和;

再更新出答案即可;

附上代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;

const int maxn=1001;
int n,m;
struct node{
	int c,d;
}a[maxn];
int f[maxn];
int ans,tot=1;

bool cmp(int x,int y){return x>y?1:0;}
int main(){
	//freopen("data.txt","r",stdin);
	freopen("launch.in","r",stdin);
	freopen("launch.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i].c),ans=max(ans,a[i].c);
	for(int i=1;i<=n;i++) scanf("%d",&a[i].d);
	for(int i=1;i<=n;i++){
	    int temp=0;
		for(int j=1;j<=n;j++) f[j]=a[j].c-(i-1)*a[j].d;
		sort(f+1,f+n+1,cmp);
		for(int j=1;j<=i;j++){
			temp+=f[j];
		}
		if(ans<=temp){
			ans=temp;
			tot=i;
		}
	}
	cout<<ans<<"\n"<<tot;
	return 0;
}

  

时间: 2024-10-26 05:42:55

noip推荐系列:汽艇[贪心]的相关文章

noip推荐系列:遥控车[字符串+高精+二分答案]

[问题描述] 平平带着韵韵来到了游乐园,看到了n辆漂亮的遥控车,每辆车上都有一个唯一的名字name[i].韵韵早就迫不及待地想玩名字是s的遥控车.可是韵韵毕竟还小,她想象的名字可能是一辆车名字的前缀(也就是说能确定一个i,使s是name[i]的前缀),这时她就能玩第i辆车:或者是一个无中生有的名字,即s不是任何一辆车名字的前缀,这时候她什么也不能玩.你需要完成下面的任务: 1.韵韵想了m个她想要的名字,请告诉她能玩多少次. 2.由于管理员粗心的操作,导致每辆车的摆放位置都可能出现微小的差错,原来

tyvj P4751 NOIP春季系列课程 H&#39;s Problem

-H's Problem- 描述 小H是一个喜欢逛街的女孩子,但是由于上了大学,DDL越来越多了,她不能一直都处于逛街的状态.为了让自己能够更加沉迷于学习,她规定一次逛街只逛T个单位的时间. 小H从1号店出发,从1号店走到第i号店需要花费ai的时间,这些店形成了一条直线,也就是说小H从第i号店走到第i+1号店需要花费的时间为a{i+1}-ai.若小H选择了第i号店并且进去逛,则会消耗bi的时间.对于第i家店,小H都对它有自己的看法.具体地,可以用ci来表示小H是否喜欢这家店.如果ci=1,则表示

【游戏推荐】黄金矿工--OGEngine精品游戏推荐系列【二】

"黄金矿工Ⅲ之神秘宝藏"是使用OGEngine开发的休闲类游戏,是黄金矿工系列的经典再现!无穷的宝藏等待你的挖掘.做好准备了吗?这里是无穷的金矿,闪耀的钻石迷惑你的双眼,更有百媚的购物小姐令你垂涎,她将提供丰富的工具,有助于你在限定时间内抓取到更多的宝藏,增加了"矿山"."草原"."沙漠"."海洋"."极地"五个场景,让你百玩不厌! 下载链接请猛戳>> http://m.wi

【游戏推荐】疯狂豹子王--OGEngine精品游戏推荐系列【三】

"疯狂豹子王"是基于OGEngine开发的卡牌类游戏,好玩的多人在线摇骰子游戏. 你还在斗地主,***等游戏中厮杀 ?!小伙伴们早已转移战场!史上首款多人在线摇骰游戏全新出炉!新颖的摇骰玩法!炫丽的夜店风格!劲爆的动感音乐,火辣的帅哥美女!以骰会友,鹿死谁手? 下载链接请猛戳>> http://m.wiorange.com/pi?id=5 http://www.eoeandroid.com/forum-863-1.html www.ogengine.com [游戏推荐]疯狂

noip知识点总结之--贪心

一.什么是贪心 贪心算法嘛... 就是在对某个问题求解时,总是做出在当前看来是最好的选择 In other wors,并不是从整体最优上加以考虑,而是在获得某种意义上的局部最优解 二.贪心算法的适用前提 局部的最优解能导致最后整体的最优解,即局部的最优解不受该部分以外的东西的影响 对于贪心算法,我们需要证明:整个问题的最优解一定由在贪心策略中存在的子问题的最优解得来的 实际上,能用贪心算法的问题很少,大部分看上去能用贪心算法去做的题目,其实都得不到最优解T T(这时候就需要运用动态规划了) 而看

【51课代表推荐系列】Excel专场优惠篇,购课满99元即送超值礼包!

无论身在职场还是未出校园,处理数据怎么都离不开办公软件.如何告别繁琐的操作,把工作效率提升10倍?今天51课代表要为大家推荐最值得掌握的办公技能--Excel! 此次专场福利:凡购买以下课程满499元,赠送价值89元的51CTO学院主题T恤一件满299元,赠送价值50元的日式抱枕一个满99元,回馈学院1000学分 Excel技巧篇 推荐语:在Excel的使用过程中,很多人没有掌握软件提供的功能,经常费了九牛二虎之力才得到想要的结果,其实Excel本身有很多的技巧,只要掌握就能够事半功倍! 推荐课

Python开发包推荐系列之xml、html解析器PyQuery

使用python,喜欢她的简洁是一方面,另外就是它有着丰富的开发包 好用又方便 接下来会给大家推荐一系列很赞的开发包. 在解析html.xml过程中,我们有不少的包可以用.比如bs.lxml.xmltodict等 如果说你想立即上手,那么pyquery必然是最佳之选. 从名字上就可以看出,她一定和jQuery有着一定的关系 在官方网站上就是这样描述它的 pyquery: a jquery-like library for python 没错,作者就是将html.xml的解析接口封装成了类似jQu

好文推荐系列--------(1)bower---管理你的客户端依赖

好文原文地址:http://segmentfault.com/a/1190000000349555 编者注:我们发现了比较有趣的系列文章<30天学习30种新技术>,准备翻译,一天一篇更新,年终礼包.以下是第一天技术的译文. 我决定将第一天的学习主题选为Bower. 什么是Bower? Bower是一个客户端技术的软件包管理器,它可用于搜索.安装和卸载如JavaScript.HTML.CSS之类的网络资源.其他一些建立在Bower基础之上的开发工具,如YeoMan和Grunt,这个会在以后的文章

[ 10.03 ]CF每日一题系列—— 534B贪心

Descripe: 贪心,贪在哪里呢-- 给你初始速度,结尾速度,行驶秒数,每秒速度可变化的范围,问你行驶秒数内最远可以行驶多少距离 Solution: 贪心,我是否加速,就是看剩下的时间能不能减到原始给定的结尾速度 #include <iostream> using namespace std; int main() { int v1,v2; int t,d; while(cin>>v1>>v2) { cin>>t>>d; int ret =