https://atcoder.jp/contests/agc003/tasks/agc003_b
经典不会做水题
查了查题解这题有两种思考方式,一是直接从左到右扫过去,如果上一位余1,那么就直接让他跟当前位的1个匹配就行,ans++,a[i-1]--,a[i]--,当前位少了1,但是多了一对,肯定不亏,然后ans+=a[i]/2,a[i]%=2,如果还剩就看能不能跟i+1匹配一下
另一种解法是每一段不为0的连续的数字,他们的贡献一定是总和/2,可以这么感性地理解,每一个1都能在这一段中找到要么是他本身匹配,要么是找左右的匹配,那么最后最多多出1个1
然而我还没想清楚vp时候的写法为什么会错。。。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxl=3e5+10;
int n,m,cnt,tot,cas;ll ans;
int a[maxl];
bool vis[maxl];
char s[maxl];
inline void prework()
{
ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i-1] && a[i])
ans++,a[i-1]--,a[i]--;
ans+=a[i]/2;a[i]%=2;
}
}
inline void mainwork()
{
}
inline void print()
{
printf("%lld",ans);
}
int main()
{
int t=1;
//scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
prework();
mainwork();
print();
}
return 0;
}