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 ...
随机推荐
- android ble connect slowly
Hi I'm writing an Android app to connect to a BLE peripheral device. Android 4.4.2, Galaxy Nexus. I ...
- 在唯一密钥属性“value”设置为“Default.aspx”时,无法添加类型为“add”的重复集合项
环境:windows server 2012 asp.net 找到网站目录:wwwroot ,打开web.config文件,在 在<files>与</files>之间加入代码 ...
- IOS7 适配时导航栏变黑
当适配IOS的布局时遇到问题:导航栏和菜单栏后台会变黑色. self.edgesForExtendedLayout = UIRectEdgeNone; 原因是系统默认这两个控件是半通明的. 解决方案: ...
- Matlab与科学计算的基本运算
各种允许的比较关系 >, >=, <, <=, ==,~=, find(), all(), any() 例:>> A=[1,2,3;4,5,6;7,8,0]A = ...
- Webbrowser 取消下载提示框
在使用Webbrowser抓取网页信息时,碰到需要下载文件,这时需要用户介入操作,如何避免: 首先引进 [DllImport("urlmon.dll", CharSet = Cha ...
- Java学习第二篇:类,对象,成员属性,成员方法,构造方法,类变量,类方法
一.类的定义 一个全面的类定义是比较复杂的, 定义如下:
- 文件夹和文件、Path类、流、序列化
循环访问目录树 参考: http://msdn.microsoft.com/zh-cn/library/bb513869.aspx 循环访问目录树”的意思是在指定的根文件夹下,访问每个嵌套子目录中任意 ...
- 2013 ACM-ICPC长沙赛区全国邀请赛—Special equations
……但是没仔细看,直接跳过了 这题直接枚举就可以过了 ;}
- Windows Azure VM的两种shut down 方式
今天在调查Azure的价格时,发现下面的语句,来自http://azure.microsoft.com/en-us/pricing/details/virtual-machines/ * If my ...
- ExecutorService中submit和execute的区别
在Java5之后,并发线程这块发生了根本的变化,最重要的莫过于新的启动.调度.管理线程的一大堆API了.在Java5以后,通过Executor来启动线程比用Thread的start()更好.在新特征中 ...