紫书 习题8-10 UVa 1614 (贪心+结论)
这道题我苦思冥想了一个小时, 想用背包来揍sum/2, 然后发现数据太大, 空间存不下。
然后我最后还是去看了别人的博客, 发现竟然有个神奇的结论……
幸好我没再钻研, 感觉这个结论我肯定是想不到的……
结论是:在1 <= a[i] <= i时, 前i个数一定可以凑出1~sum[i]的所有整数
证明看这 https://blog.csdn.net/wcr1996/article/details/43957461
其他博客写有了这个结论, 就排序一下, 从大到小, 凑sum/2, 能凑就凑, 最后一定可以凑成。
但是我开始一直想不通为啥这样下去一定可以凑成, 为什么要排序??其他博客貌似没有
给出解释……
然后我自己思考了挺久, 想通了。
首先这个结论证明一定可以揍成sum/2(sum为奇数不考虑, 输出No)
然后, 从大到小排序。
假设第一个可以凑的数为a[k], a[k]显然是第一个小于等于sum/2的数
也就是说a[k]之前的数, 也就是所有大于a[k]的数, 都大于sum/2
也就是说这些数不可能来揍sum/2.
然后sum/2就减去了a[k]。那么a[k]之后的数一定可以凑sum/2-a[k];
为什么呢?这里是关键。
因为要凑sum/2-a[k]的数字肯定小于sum/2-a[k], 而这些数字一定在a[k]之后
因为a[k]是第一个小于等于sum/2的数, 那么第一个小于等于sum/2-a[k]的数字
肯定小于等于a[k], 也就肯定在a[k]后面。
所以要凑成sum/2-a[k]的数都在a[k]后面, 这些数字还没有被选到。
因为开始的结论说明肯定可以凑sum/2-a[k], 而所有需要来凑
sum/2-a[k]的数还没有遍历到。
所以, sum/2-a[k]一定可以用还没遍历到的数凑成。
以此类推, 一直做下去, 肯定可以凑完
over!!!!!!!!!!
#include<cstdio>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;
const int MAXN = 112345;
int a[MAXN], id[MAXN], n;
bool cmp(int x, int y)
{
return a[x] > a[y];
}
int main()
{
while(~scanf("%d", &n))
{
long long sum = 0;
REP(i, 0, n)
{
scanf("%d", &a[i]);
sum += a[i];
id[i] = i;
}
if(sum & 1) { puts("No"); continue; }
sort(id, id + n, cmp);
sum >>= 1;
REP(i, 0, n)
{
int t = id[i];
if(a[t] <= sum)
{
sum -= a[t];
a[t] = 1;
}
else a[t] = -1;
}
puts("Yes");
REP(i, 0, n) printf("%d ", a[i]);
puts("");
}
return 0;
}
紫书 习题8-10 UVa 1614 (贪心+结论)的更多相关文章
- 紫书 习题8-12 UVa 1153(贪心)
本来以为这道题是考不相交区间, 结果还专门复习了一遍前面写的, 然后发现这道题的区间是不是 固定的, 是在一个范围内"滑动的", 只要右端点不超过截止时间就ok. 然后我就先考虑有 ...
- 紫书 习题 11-9 UVa 12549 (二分图最小点覆盖)
用到了二分图的一些性质, 最大匹配数=最小点覆盖 貌似在白书上有讲 还不是很懂, 自己看着别人的博客用网络流写了一遍 反正以后学白书应该会系统学二分图的,紫书上没讲深. 目前就这样吧. #includ ...
- 紫书 习题 11-8 UVa 1663 (最大流求二分图最大基数匹配)
很奇怪, 看到网上用的都是匈牙利算法求最大基数匹配 紫书上压根没讲这个算法, 而是用最大流求的. 难道是因为第一个人用匈牙利算法然后其他所有的博客都是看这个博客的吗? 很有可能-- 回归正题. 题目中 ...
- 紫书 习题8-7 UVa 11925(构造法, 不需逆向)
这道题的意思紫书上是错误的-- 难怪一开始我非常奇怪为什么第二个样例输出的是2, 按照紫书上的意思应该是22 然后就不管了,先写, 然后就WA了. 然后看了https://blog.csdn.net/ ...
- 紫书 习题 8-13 UVa 10570 (枚举+贪心)
我看到数据范围只有500, 第一反应枚举所有的可能,然后求出每种可能的最小次数. 但是不知道怎么求最小次数.我想的是尽量让一次交换可以让两个不在应该在的位置的数字 到原来应该在的位置的数字, 这样可以 ...
- 紫书 习题8-8 UVa 1612 (贪心+精度)
这道题我很快就写出来了, 但是一直WA, 然后发现是精度, 这坑了我一个小时-- (1)贪心.每次就尽量分数高, 可以保证最后分数最高 (2)神tm精度问题.记住判断大于小于和等于的时候要用EPS(1 ...
- 紫书 习题8-4 UVa 11491 (贪心)
题意:给你一个数, 要求删去一些数字, 使得剩下的数字最大. 这道题用贪心解决. 大家想一想, 两个数比较大小, 肯定先比较第一位的数,然后依次比较第二位,以此类推. 既然我们要保证最后的数字最大, ...
- 紫书 习题 8-23 UVa 1623 (set妙用 + 贪心)
这道题我是从样例中看出思路了 2 4 0 0 1 1 看这组数据, 输出的是No, 为什么呢?因为两个1之间没有神龙喝水, 所以一定会有水灾. 然后就启发了我,两次同一个湖的降水之间必须至少有一次神龙 ...
- 紫书 习题 8-15 UVa 1617 (贪心)
先排序, 然后每个线段先放右端点, 然后往下放, 如果不能放就整体往左移动, 当不能往左移动的时候就ans++ 开始下一个整块.判断能不能向左移动要用一个变量储存每个已经放了的区间中线段与左端点距离的 ...
随机推荐
- input上传文件获取文件后缀名+select通过text选中option
1.input获取后缀名 var fileName = $("input[type='file']").val();//获取上传的文件(单个) var extName = file ...
- 如何打印枚举类型:%d
#include <stdio.h> typedef enum SessionState { SESSION_OPENING, /* Session scope is being crea ...
- 四、服务器上的 Git
一个远程仓库通常只是一个裸仓库(bare repository)— 即一个没有当前工作目录的仓库.因为该仓库仅仅作为合作媒介,不需要从磁碟检查快照:存放的只有 Git 的资料.简单的说,裸仓库就是你专 ...
- Mysql学习总结(31)——MySql使用建议,尽量避免这些问题
做服务器端开发的同学们,相信对于mysql应该是十分熟悉,但是一旦真正出现问题,你是否能够快速的发现问题的起因,并且解决呢?一旦问题涉及到数据库层面,往往不是那么好解决的,通常来说,我们需要提前做应对 ...
- ES学习——分析器和自定义分析器
简介 es在对文档进行倒排索引的需要用分析器(Analyzer)对文档进行分析.建立索引.从文档中提取词元(Token)的算法称为分词器(Tokenizer),在分词前预处理的算法称为字符过滤器(Ch ...
- SQL SERVER-主键的建立和删除
PRIMARY KEY 约束唯一标识数据库表中的每条记录.主键必须包含唯一的值.主键列不能包含 NULL 值.每个表都应该有一个主键,并且每个表只能有一个主键.主键约束操作包含了添加约束和删除约束,修 ...
- 今天修了一个bug,关于debug日志的问题
是别人的代码,很诡异. 就是开了debug日志,没问题. 关了debug日志,就出问题. 开始我以为是debug日志拖慢了速度,所以有一些竞态环境的影响. 后来发现是在debug日志里面有一些side ...
- ZOJ 3640
很简单的概率题了 设dp[x]为能力值 为x时出去的期望 天数 #include <iostream> #include <cstdio> #include <cmath ...
- Raspberry PI 系列 —— 裸机点亮LED灯
Raspberry PI 系列 -- 裸机点亮LED灯 背景 近期刚买了Raspberry PI B+,配置执行了官方提供的Raspbian系统,折腾了一周Linux系统,感觉没啥意思,于是就试着想了 ...
- Swift基础--定位
// // ViewController.swift // JieCoreLocation // // Created by jiezhang on 14-10-4. // Copyright (c) ...