这题出的棒极了。深刻的体会到...会拍版,会写各种数据结构算什么!!
题目大意:
一排牛,要挤奶,牛 有的往 左看,有的往右看。当牛看到其他牛被挤奶时,奶产量会降低。问最少降低多少?
想到贪心非常容易,每次找惊吓其他牛最少的那头开始,问题是怎么找一个挤奶的序列呢?
我们来研究任意两头牛的关系
对于 A B (A 在 B 的左边)
A 左 B 右 随便挤都不会有问题
A 右 B 右 或者 A 左 B 左 这样就有个顺序问题,要先挤后面那个
A 右 B 左 无论先挤哪个都有问题
所以产生顺序关系的只有中间一种,我们只需要把朝向右的从左往右开始,再把朝向左的从右往左开始。中间统计第三种情况所产生的消耗就是答案。
但我们发现挤完一种顺序的另一种便不会再产生消耗了,所以只统计一种就可以了。
遇到朝向左的就统计他左边朝向右的有几个就 OK。
这道题出的非常好,其实我原本以为这是一个数据结构的题目,其实完全不是,就是考你的分析能力,这样的题才叫好题。
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define MAX 300000
ll R[MAX];
int main()
{
ll n;
cin>>n;
ll ans=0;
for(int i=1;i<=n;i++)
{
int t;
cin>>t;
R[i]=R[i-1]+(t==1?1:0);
if(t==0)
ans+=R[i];
}
cout<<ans<<endl;
return 0;
}