[贪心]救救曹植 qduoj22Spring8

2023-10-23 13:10

本文主要是介绍[贪心]救救曹植 qduoj22Spring8,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

曹植是三国时期著名文学家,被谢灵运称之为”天下才有一石,曹子建独占八斗“。但可惜的是,他和他的哥哥曹丕关系不好。

这天在曹丕的疯狂push之下,曹植七步成诗,写出了”本是同根生,相煎何太急“之句。曹丕心想:这七步成诗是我的idea,你通讯作者不挂我就算了,还敢内涵我迫害兄弟。我刚当皇帝,受得了这委屈?今天一定要让你知道知道厉害!

于是曹丕让人呈上标号为1 ~ nn个杯子。每个杯子里装有ai个豆子。然后对曹植说:“现在你要用最少的次数把杯子里的豆子取光。取豆方式是,每次选一个编号x,然后从编号为x, 2 * x, 2 * x + 1的杯子中分别取一个豆子。如果杯子里没有豆子了,那就不用取;你不能在编号之外的杯子里取豆,所以2*x + 1  ≤ n。”

”如果你能做到,就将所取之豆放进釜中,你我兄弟今日饮宴就吃豆羹;如果你做不到,那今日在釜中哭泣的就不是豆子了“。

聪明如你,能帮曹植解决这个问题吗?

Input

第一行包含一个整数n (1 ≤n≤ 100)表示杯子数目。

第二行包含n个由空格隔开的整数:a1, a2, a3, ...., an(1 ≤ ai≤ 1000),其中ai表示开始时杯子中豆子的数目。

Output

如果可以将所有豆子取光,输出一个整数表示取豆子所需的最少次数。

如果不能将所有豆子取光,输出-1

Sample Input 1 

2
1 1

Sample Output 1

-1

Sample Input 2 

3
868 762 256

Sample Output 2

868

题意: 有n个杯子,每个杯子中放有a[i]个豆子,每次可以从编号为x,2*x,2*x+1的杯子中取出一个豆子,如果2*x+1超出边界那就不能取,杯子中没有豆子时也可以取,问最终把豆子取完最少多少次。

分析: 一开始考虑正着贪心,每次把i的杯子取到0,如果最后还有豆子就说明不可能取完。后来发现这样是错的,因为在杯子为空时还可以取,这样最终总是能取完的,可以画出一张图,这就是从1~9时所有能取的操作,可以发现如果n为偶数那么一定无法取完,如果n是奇数就总能取完。

画出图来就很直观了,在从前往后贪心时把a[i]变成0实际上有两种方式,要么是让i作为x去取,要么是让i作为2*x或2*x+1去取,这两种方式都能把a[i]取到0,但具体哪种更好其实是不确定的,例如上图中取到4时,如果4中还不为0那么可以选择取(2, 4, 5)或者(4, 8, 9)。但如果考虑从后往前贪心,9这个位置只有一种方式取完,也就是无论之后如何选择一定会存在a[9]次选取(4, 8, 9),为了达到最优可以先处理这些一定会进行的操作,同理8、7、6、5都是这样的,当到4这里时存在两种选取方式了,但是一定是选(2, 4, 5)更优,因为4后面的杯子都为空了,选(4, 8, 9)显然会造成浪费,也就是无论之后如何选择一定会存在a[4]次选取(2, 4, 5),于是为了最优先把这些次数取完,在3、2处同理。最后在1处只有一种选取方式,就只能选(1, 2, 3)直到1为空。

具体代码如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <string>
using namespace std;int a[105];signed main()
{int n;cin >> n;for(int i = 1; i <= n; i++)scanf("%d", &a[i]);if(n%2==0 || n <= 2) puts("-1");else{int ans = 0;for(int i = n; i >= 1; i--){if(a[i] > 0){if(i&1){a[i-1] -= a[i];a[i/2] -= a[i];}else{a[i+1] -= a[i];a[i/2] -= a[i];}ans += a[i];a[i] = 0;}}cout << ans;}return 0;
}

这篇关于[贪心]救救曹植 qduoj22Spring8的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/268055

相关文章

usaco 1.3 Barn Repair(贪心)

思路:用上M块木板时有 M-1 个间隙。目标是让总间隙最大。将相邻两个有牛的牛棚之间间隔的牛棚数排序,选取最大的M-1个作为间隙,其余地方用木板盖住。 做法: 1.若,板(M) 的数目大于或等于 牛棚中有牛的数目(C),则 目测 给每个牛牛发一个板就为最小的需求~ 2.否则,先对 牛牛们的门牌号排序,然后 用一个数组 blank[ ] 记录两门牌号之间的距离,然后 用数组 an

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

POJ2010 贪心优先队列

c头牛,需要选n头(奇数);学校总共有f的资金, 每头牛分数score和学费cost,问合法招生方案中,中间分数(即排名第(n+1)/2)最高的是多少。 n头牛按照先score后cost从小到大排序; 枚举中间score的牛,  预处理左边与右边的最小花费和。 预处理直接优先队列贪心 public class Main {public static voi

ural 1820. Ural Steaks 贪心

1820. Ural Steaks Time limit: 0.5 second Memory limit: 64 MB After the personal contest, happy but hungry programmers dropped into the restaurant “Ural Steaks” and ordered  n specialty steaks

ural 1014. Product of Digits贪心

1014. Product of Digits Time limit: 1.0 second Memory limit: 64 MB Your task is to find the minimal positive integer number  Q so that the product of digits of  Q is exactly equal to  N. Inpu

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

BUYING FEED(贪心+树状动态规划)

BUYING FEED 时间限制: 3000 ms  |  内存限制: 65535 KB 难度:4 描述 Farmer John needs to travel to town to pick up K (1 <= K <= 100)pounds of feed. Driving D miles with K pounds of feed in his truck costs D

vua 10700-Camel trading 贪心以及栈

大意:给一个表达式,可以让你任意套括号,问套完括号最大最小值是多少 贪心策略:最大的话,先+后*                  最小的话,先*后+ 用了一个栈堆模拟运算的次序 #include<stdio.h>#include<iostream>#include<stack>using namespace std;int main(){int N;scanf("%d",&

Commando War-uva 贪心

大意:给你N个任务,你交代他需要J时间,完成他需要B时间,问怎么搭配可以使全部问题完成时话的时间最少 思路:贪心算法,先做完成时间长的,完成时间相同的话先做交代时间长的,用了一下结构体二级快排 #include<stdio.h>#include<string.h>#include<stdlib.h>#define MAX_SIZE 1000 + 10struct Time{int