UVa 1614 Hell on the Markets (贪心+推理)
题意:给定一个长度为 n 的序列,满足 1 <= ai <= i,要求确实每一个的符号,使得它们和为0.
析:首先这一个贪心的题目,再首先不是我想出来的,是我猜的,但并不知道为什么,然后在网上搜了一下题解,是什么数学归纳法。。。。。。
贪心策略:1~i的和或者部分和一定能凑出来1~sum[i]。
利用这个策略,也就是说,只要最后和是偶数,那么就一定有解,那这个解怎么求呢??我们先把所有的数从大到小排序,然后逆向计算,如果前 i-1 项和大于0,
那么就减掉第 i 项,否则就加上第 i 项,这样的话,最后的和肯定是0.是我猜,但是AC了。
下面是证明过程,利用的是数学归纳法,当 i = 1时,成立,当 i = k时,假设成立,sum[k+1] = sum[k] + a[k+1],那么只要能求出sum[k]+1~sum[k+1],
设1≤p≤a[k+1],sum[k]+p=sum[k]+a[k+1]-(a[k+1]-p)。因为1 ≤ a[i] ≤ i,易得 sum[k] ≥ k, a[k+1] - p ≤ k。所以一定可以凑出 a[k+1] - p。
所以只需从之前凑出sum[k]里面剪掉凑出a[k+1]-p的数就可以凑 出sum[k]+p。所以从1~sum[k+1]都可以凑出。
代码如下:
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- #include <vector>
- using namespace std;
- const int maxn = 1E5 + 5;
- struct node{
- int id, num, ans;
- };
- node a[maxn];
- bool cmp1(const node &p, const node &q){
- return p.id < q.id;
- }
- bool cmp2(const node &p, const node &q){
- return p.num > q.num;
- }
- int main(){
- int n;
- while(scanf("%d", &n) == 1){
- int s = 0;
- for(int i = 0; i < n; ++i){ scanf("%d", &a[i].num); a[i].id = i; s += a[i].num; }
- if(s & 1){ puts("No"); continue; }
- else puts("Yes");
- s = 0;
- sort(a, a+n, cmp2);
- for(int i = 0; i < n; ++i)
- if(s > 0){ s -= a[i].num; a[i].ans = -1; }
- else { s += a[i].num; a[i].ans = 1; }
- sort(a, a+n, cmp1);
- printf("%d", a[0].ans);
- for(int i = 1; i < n; ++i) printf(" %d", a[i].ans);
- printf("\n");
- }
- return 0;
- }
UVa 1614 Hell on the Markets (贪心+推理)的更多相关文章
- UVA 1614 - Hell on the Markets 奇怪的股市(贪心,结论)
先证明一个结论吧,对于1≤ai≤i+1,前面ai个数一定可以凑出1~sum[i]中的任意一个数. 对于i=1显然成立, 假设对于i=k结论成立,那么对于i=k+1来说,只要证明sum[k]+i,1≤i ...
- UVA - 1614 Hell on the Markets(奇怪的股市)(贪心)
题意:输入一个长度为n(n<=100000)的序列a,满足1<=ai<=i,要求确定每个数的正负号,使得所有数的总和为0. 分析: 1.若总和为0,则未加符号之前,所有数之和必为偶数 ...
- UVA 1614 - Hell on the Markets
题意: 输入n个数,第i个数ai满足1≤ai≤i.对每个数添加符号,使和值为0. 分析: 排序后从最大的元素(假设为k)开始,凑出sum/2即可.用去掉了k的集合,一定可以凑出sum/2 - a[k] ...
- uva 1614奇怪的股市(归纳法证明,贪心)
uva 1614奇怪的股市(归纳法证明,贪心) 输入一个长度为n的序列a,满足\(1\le a_i\le i\),要求确定每个数的正负号,使得所有数的总和为0.例如a={1, 2, 3, 4},则4个 ...
- Uva 11729 Commando War (简单贪心)
Uva 11729 Commando War (简单贪心) There is a war and it doesn't look very promising for your country. N ...
- uva 1153 顾客是上帝(贪心)
uva 1153 顾客是上帝(贪心) 有n个工作,已知每个工作需要的时间q[i]和截止时间d[i](必须在此前完成),最多能完成多少个工作?工作只能串行完成,第一项任务开始的时间不早于时刻0. 这道题 ...
- 【uva 1614】Hell on the Markets(算法效率--贪心)
题意:有一个长度为N的序列A,满足1≤Ai≤i,每个数的正负号不知.请输出一种正负号的情况,使得所有数的和为0.(N≤100000) 解法:(我本来只想静静地继续做一个口胡选手...←_← 但是因为这 ...
- UVA - 1614 Hell on the Market(贪心)
Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Descript ...
- UVA-1614 Hell on the Markets(贪心+推理) (有待补充)
题目大意:一个整数序列a,1≤a[i]≤i.问能否通过在一些元素前加上负号,使得整个序列和为0. 题目分析:贪心.贪心策略:每次都先选最大的元素加负号(或保留,不加负号). 贪心依据:对于1≤a[i] ...
随机推荐
- Windows 10 上的 Git 如何清除密码? Git Credential Manager for Windows
Windows 10 上的 Git 如何清除密码? 因为一台新的电脑是 Windows 10 在第一次使用 Git 要求输入密码时把密码给输错了. 之前提交都是说 Token 错了,不再出现提示密码. ...
- 转:HL7 Tools suite
HL7 Tools suite HL7的官网有很多开源工具, 比如:RoseTree,V3Generator,RMIM Designer, Design Repository, V2 & ...
- 黄聪:win7 64位系统PS、AI、PSD缩略图预览补丁
MysticThumbs支持Windows 7 / Vista / XP,32位和64位.除了预览PSD以外,还支持DDS.SGI缩略图显示. Mystic Thumbs是一款用来支持win7 64位 ...
- 关于 ImageLoader 说的够细了。。。
简介ImageLoader(一) 分类: android 开源及第三方项目2014-05-30 12:14 14126人阅读 评论(0) 收藏 举报 ImageLoader 使用该开源项目的之前,先给 ...
- 花瓶使用笔记 (抓数据时,记得添加host,不然抓不了包的)
情况一: 有时候抓不了app的数据,那么把app的host 添加一下就可以了 proxy > SSL Proxying Settings 情况二: 开了 翻 墙 是抓不了包的! (掉了一次坑)
- VMware vSphere Client下增加虚拟机磁盘空间的方法
随着系统运维时间的增长,磁盘就日益的损耗,如果遇到虚拟机报磁盘空间不足怎么办?还好,我们可以通过磁盘阵列增加磁盘空间,然后扩容到虚拟机中去. 对于linux虚拟机磁盘扩容的方案有两种,一种就是原有的实 ...
- Unreal Enginer4特性介绍
转自:http://blog.csdn.net/cartzhang/article/details/39401991 一.特性说明 特性 Ue4是一款专业开发高质量游戏的平台开发工具.Ue4的渲染加快 ...
- HDU6128-Inverse of sum
参考这篇博客:https://blog.csdn.net/dormousenone/article/details/77340852 #include<bits/stdc++.h> usi ...
- Protocol入门
参考:http://haoxiang.org/2011/08/ios-delegate-and-protocol/ 介绍: Protocol在iOS中就是协议,简单的理解就是一组函数的集合,这个集合中 ...
- easyui制作进度条案例demo
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...