Codeforces 383A - Milking cows
原题地址:http://codeforces.com/problemset/problem/383/A
题目大意:有 n 头奶牛,全部看着左边或者右边,现在开始给奶牛挤奶,给一头奶牛挤奶时,所有能看到它的奶牛会损失一升奶,已经挤过的奶牛不会再损失,求一种挤奶顺序,使得失去的牛奶数最少。(1 <= n <= 200000)
题目分析:考场上看到它的时候想:这不就是一个裸的线段树么……但是由于线段树不熟就没写出来……考完参照网上一些解法发现自己真的是想多了……唉……原来是贪心
我们需要证明以下一个性质:
最优值一定会出现在先挤完所有向左看的奶牛或者所有向右看的奶牛这两种情况之中(当然不止会出现在这两种情况之中),并且,我们一定先从最右边的向左看的奶牛或者最左边的向右看的奶牛挤起。
首先第二条性质不难理解,如果我们先从中间的一个挤起,必然不会比挤最边上的那头更优,可以用反证法来证明一下。
设suml[i]为从1 ~ i向左看的奶牛的个数,sumr[i]为从1 ~ i向右看的奶牛的个数,假设第k、j头奶牛是向左看的(且j在k的右边),若先挤第k头奶牛更优,则必须满足
suml[n] - suml[k] + sumr[k - 1] + suml[n] - suml[j] + sumr[j - 1] <= suml[n] - suml[j] + sumr[j - 1] + (suml[n] - 1 - suml[k]) + sumr[k - 1] (减一是因为 j 已经被挤过了,不可能再失去牛奶)这显然不会成立
第一条性质也因此变得显然了,加入我们先挤看着右边的,假设共有w头奶牛能看到最右边的看着左边的奶牛(权且成为P),那么同理,P能看到的看着右边的奶牛有且仅有w头,那么在挤这w头奶牛的过程中,P会失去w单位的奶,而如果我们先挤P,那w头奶牛也会失去w单位的奶,所以它们是等价的。
那么只需要扫一遍就好啦~
//date 20140121
#include <cstdio>
#include <cstring>
#include <iostream> using namespace std; const int maxn = ; inline int getint()
{
int ans(); char w = getchar();
while('' > w || w > '')w = getchar();
while('' <= w && w <= '')
{
ans = ans * + w - '';
w = getchar();
}
return ans;
} int n;
int stu[maxn], l[maxn], r[maxn]; int main()
{
// freopen("c.in", "r", stdin); n = getint();
for(int i = ; i <= n; ++i)stu[i] = getint();
for(int i = ; i <= n; ++i)l[i] = l[i - ] + stu[i - ];
for(int i = n - ; i >= ; --i)r[i] = r[i + ] + (!stu[i + ]);
long long a1 = , a2 = ; for(int i = n; i >= ; --i)a1 += (long long)(stu[i] == ? l[i] : );
for(int i = ; i <= n; ++i)a2 += (long long)(stu[i] == ? r[i] : ); cout << (a1 < a2 ? a1 : a2) << endl;
return ;
}
Codeforces 383A - Milking cows的更多相关文章
- CodeForces 384C Milking cows
水题. 对于两个$0$,肯定是先删去后面的$0$,再删去前面的$0$. 对于两个$1$,肯定是先删去前面的$1$,再删去后面的$1$. 对于一个$0$和一个$1$,无论先删哪一个,对答案做出的贡献都是 ...
- Milking Cows
Milking Cows Three farmers rise at 5 am each morning and head for the barn to milk three cows. The f ...
- 洛谷P1204 [USACO1.2]挤牛奶Milking Cows
P1204 [USACO1.2]挤牛奶Milking Cows 474通过 1.4K提交 题目提供者该用户不存在 标签USACO 难度普及- 提交 讨论 题解 最新讨论 请各位帮忙看下程序 错误 ...
- codeforce ---A. Milking cows
A. Milking cows time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- 【题解】Luogu P1204 [USACO1.2]挤牛奶Milking Cows
原题传送门:P1204 [USACO1.2]挤牛奶Milking Cows 实际是道很弱智的题目qaq 但窝还是觉得用珂朵莉树写会++rp(窝都初二了,还要考pj) 前置芝士:珂朵莉树 窝博客里对珂朵 ...
- Milking Cows 挤牛奶
1.2.1 Milking Cows 挤牛奶 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 554 Solved: 108[Submit][Status ...
- 【洛谷P1204】【USACO1.2】挤牛奶Milking Cows
P1204 [USACO1.2]挤牛奶Milking Cows 题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶.第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒.第二个 ...
- Milking Cows 挤牛奶 USACO 排序 模拟
1005: 1.2.1 Milking Cows 挤牛奶 时间限制: 1 Sec 内存限制: 128 MB提交: 15 解决: 9[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 1 ...
- 【USACO】Milking Cows
Three farmers rise at 5 am each morning and head for the barn to milk three cows. The first farmer b ...
随机推荐
- ListView防止滑动变色的小技巧
listview滑动时会变成白色,如果背景色不是白色的话可以通过设置setCacheColorHint(Color.TRANSPARENT);来避免变色,.对应的xml也可以进行设置.
- 1458: 士兵占领 - BZOJ
Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放 ...
- ios 多任务学习笔记
一.检测多任务是否支持: - (BOOL) isMultitaskingSupported{ BOOL result = NO; if ([[UIDevice currentDevice] respo ...
- git/github在windows上使用
问题描述: git在Windows上的使用 问题解决: (1)下载安装git http://msysgit.github.io/ 到该网址中下载msgit软件 注: 安装msg ...
- oracle——分析函数——排序值分析函数
一.问题描述 查询列表时,我们有时需要对查询结果依据某个字段进行排名. 如果每条记录在排序字段上都不相同,我们可以将原查询作为一个视图,查询其rownum,便可以实现简单排序,例如: select r ...
- PAT-乙级-1050. 螺旋矩阵(25)
1050. 螺旋矩阵(25) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求将给定的N个正整数按非递增的 ...
- C++中的mutable关键字
mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词. 在C++中,mutable也是为了突破const的限制而设置的.被mutable修饰的变量,将永远 ...
- linux 下 apache启动、停止、重启命令
基本的操作方法: 本文假设你的apahce安装目录为/usr/local/apache2,这些方法适合任何情况 apahce启动命令: 推荐/usr/local/apache2/bin/apachec ...
- jquery加入收藏代码
<html> <head> <script type="text/javascript" src="jquery-1.9.1.js" ...
- DevOps 和技术债务偿还自动化
当企业想要迁移到一个 DevOps 模型时,经常需要偿还高等级的技术债务 说得更明确一点,机构往往陷入「技术债务的恶性循环」中,以至于任何迅速.敏捷的迁移方式都无法使用.这是技术债务中的希腊债务危机水 ...