A.Ilya and a Colorful Walk
题意:
有n栋房子,每栋房子都有一种颜色,并且房子的位置为i,问最远的不同颜色的房子的距离是多少。
题解:
贪心,从最开始和最后面开始找,比较当前第i间和第j间房子颜色是否相等,如果不等,就比较第i间和第j-1间、第i+1间和第j间,如果不等,进行下一次比较,如果进行下一次比较,说明第i,j,i+1,j-1的房子颜色相等。
AC_CODE:
/*
* Author: lwktxdy
* Time: 2020-01-26 13:40:07
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<iostream>
#include<sstream>
#include<set>
#include<map>
#include<queue>
#include<bitset>
#include<vector>
#include<limits.h>
#include<assert.h>
#include<bits/stdc++.h>
#define SZ(X) ((int)(X).size())
#define ALL(X) (X).begin(), (X).end()
#define REP(I, N) for (int I = 0; I < (N); ++I)
#define REPP(I, A, B) for (int I = (A); I < (B); ++I)
#define FOR(I, A, B) for (int I = (A); I <= (B); ++I)
#define FORS(I, S) for (int I = 0; S[I]; ++I)
#define RS(X) scanf("%s", (X))
#define SORT_UNIQUE(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end()))))
#define GET_POS(c,x) (lower_bound(c.begin(),c.end(),x)-c.begin())
#define CASET int ___T; scanf("%d", &___T); for(int cs=1;cs<=___T;cs++)
#define MP make_pair
#define PB push_back
#define MS0(X) memset((X), 0, sizeof((X)))
#define MS1(X) memset((X), -1, sizeof((X)))
#define LEN(X) strlen(X)
#define F first
#define S second
using namespace std;
typedef long long ll,LL;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef vector<LL> VL;
typedef vector<PII> VPII;
typedef pair<LL,LL> PLL;
typedef vector<PLL> VPLL;
template<class T> void _R(T &x) { cin >> x; }
void _R(int &x) { scanf("%d", &x); }
void _R(LL &x) { scanf("%lld", &x); }
void _R(double &x) { scanf("%lf", &x); }
void _R(char &x) { scanf(" %c", &x); }
void _R(char *x) { scanf("%s", x); }
void R() {}
template<class T, class... U> void R(T &head, U &... tail) { _R(head); R(tail...); }
template<class T> void _W(const T &x) { cout << x; }
void _W(const int &x) { printf("%d", x); }
void _W(const LL &x) { printf("%lld", x); }
void _W(const double &x) { printf("%.16f", x); }
void _W(const char &x) { putchar(x); }
void _W(const char *x) { printf("%s", x); }
template<class T,class U> void _W(const pair<T,U> &x) {_W(x.F); putchar(' '); _W(x.S);}
template<class T> void _W(const vector<T> &x) { for (auto i = x.begin(); i != x.end(); _W(*i++)) if (i != x.cbegin()) putchar(' '); }
void W() {}
template<class T, class... U> void W(const T &head, const U &... tail) { _W(head); putchar(sizeof...(tail) ? ' ' : '\n'); W(tail...); }
#ifdef HOME
#define DEBUG(...) {printf("# ");printf(__VA_ARGS__);puts("");}
#else
#define DEBUG(...)
#endif
#define Test() int t; cin >> t; while(t--)
#define in freopen("in.txt","r",stdin);
#define out freopen("out.txt","w",stdout);
#define mod 998244353
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
const int maxn = 4e6+5;
char s[maxn];
int a[maxn];
/*
struct node{
}k[maxn];
*/
int main(){
int n;
R(n);
FOR(i,1,n) R(a[i]);
for(int i=1,j=n; i<=j; ){
if(a[i] != a[j]){
W(j-i);
break;
}else{
if(a[i+1] != a[j]){
W(n-i-1);
break;
}else if(a[i] != a[j-1]){
W(j-2);
break;
}else{
i += 1;
j -= 1;
}
}
}
}
B.Alyona and a Narrow Fridge
题意:
有一个2*h的冰箱,你可以往冰箱插入挡板(无厚度),挡板长度为2,然后依次给n种高度的牛奶,牛奶只能放在挡板上,问最多能放置多少牛奶?PS:需要按顺序放置。
题解:
每次同时放入2瓶牛奶,然后对牛奶高度进行排序(题解按从小到大排),第1瓶牛奶和第2瓶牛奶放一起,第3瓶牛奶和第四瓶牛奶放一起,… ,然后这些牛奶所占空间(最优)为height(1)+height(3)+…,判断当前空间和h的关系,如果小于等于h,那么可以继续放置新的牛奶,否则,判断只放入一瓶牛奶时所占的空间,由于现在的状态是奇数瓶牛奶,容易证明,当前所占空间(最优)为height(1) + height(2) + height(4) + height(6) + …,即从大到小,大的放一块,最小的单独放。
AC_CODE:
/*
* Author: lwktxdy
* Time: 2020-01-26 13:40:07
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<iostream>
#include<sstream>
#include<set>
#include<map>
#include<queue>
#include<bitset>
#include<vector>
#include<limits.h>
#include<assert.h>
#include<bits/stdc++.h>
#define SZ(X) ((int)(X).size())
#define ALL(X) (X).begin(), (X).end()
#define REP(I, N) for (int I = 0; I < (N); ++I)
#define REPP(I, A, B) for (int I = (A); I < (B); ++I)
#define FOR(I, A, B) for (int I = (A); I <= (B); ++I)
#define FORS(I, S) for (int I = 0; S[I]; ++I)
#define RS(X) scanf("%s", (X))
#define SORT_UNIQUE(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end()))))
#define GET_POS(c,x) (lower_bound(c.begin(),c.end(),x)-c.begin())
#define CASET int ___T; scanf("%d", &___T); for(int cs=1;cs<=___T;cs++)
#define MP make_pair
#define PB push_back
#define MS0(X) memset((X), 0, sizeof((X)))
#define MS1(X) memset((X), -1, sizeof((X)))
#define LEN(X) strlen(X)
#define F first
#define S second
using namespace std;
typedef long long ll,LL;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef vector<LL> VL;
typedef vector<PII> VPII;
typedef pair<LL,LL> PLL;
typedef vector<PLL> VPLL;
template<class T> void _R(T &x) { cin >> x; }
void _R(int &x) { scanf("%d", &x); }
void _R(LL &x) { scanf("%lld", &x); }
void _R(double &x) { scanf("%lf", &x); }
void _R(char &x) { scanf(" %c", &x); }
void _R(char *x) { scanf("%s", x); }
void R() {}
template<class T, class... U> void R(T &head, U &... tail) { _R(head); R(tail...); }
template<class T> void _W(const T &x) { cout << x; }
void _W(const int &x) { printf("%d", x); }
void _W(const LL &x) { printf("%lld", x); }
void _W(const double &x) { printf("%.16f", x); }
void _W(const char &x) { putchar(x); }
void _W(const char *x) { printf("%s", x); }
template<class T,class U> void _W(const pair<T,U> &x) {_W(x.F); putchar(' '); _W(x.S);}
template<class T> void _W(const vector<T> &x) { for (auto i = x.begin(); i != x.end(); _W(*i++)) if (i != x.cbegin()) putchar(' '); }
void W() {}
template<class T, class... U> void W(const T &head, const U &... tail) { _W(head); putchar(sizeof...(tail) ? ' ' : '\n'); W(tail...); }
#ifdef HOME
#define DEBUG(...) {printf("# ");printf(__VA_ARGS__);puts("");}
#else
#define DEBUG(...)
#endif
#define Test() int t; cin >> t; while(t--)
#define in freopen("in.txt","r",stdin);
#define out freopen("out.txt","w",stdout);
#define mod 998244353
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
const int maxn = 4e6+5;
char s[maxn];
ll a[maxn];
/*
struct node{
}k[maxn];
*/
int main(){
ll n,h;
R(n,h);
FOR(i,1,n) R(a[i]);
VL vl1,vl2;
int i=1;
for(; i<=n-1; i += 2){
ll first = a[i];
ll second = a[i+1];
vl2.PB(first);
vl2.PB(second);
ll sum = 0LL;
sort(vl2.begin(),vl2.end());
for(int j=1; j<SZ(vl2); j+=2){
sum += vl2[j];
}
if(sum > h){
vl1.PB(first);
sort(vl1.begin(),vl1.end());
ll new_sum = 0;
for(int j=SZ(vl1)-1; j>1; j-=2){
new_sum += vl1[j];
}
new_sum += vl1[0];
W((new_sum > h ? static_cast<int>(SZ(vl1) - 1) : SZ(vl1)));
return 0;
}else{
vl1.PB(first);
vl1.PB(second);
}
}
if(n % 2){
vl2.PB(a[n]);
sort(vl2.begin(),vl2.end());
ll new_sum = 0;
for(int j=SZ(vl2)-1; j>1; j-=2){
new_sum += vl2[j];
}
new_sum += vl2[0];
W((new_sum > h ? static_cast<int>(SZ(vl2) - 1) : SZ(vl2)));
return 0;
}else{
sort(vl1.begin(),vl1.end());
ll new_sum = 0;
for(int j=SZ(vl1)-1; j>1; j-=2){
new_sum += vl1[j];
}
new_sum += vl1[0];
W((new_sum > h ? static_cast<int>(SZ(vl1) - 1) : SZ(vl1)));
return 0;
}
}
C.Ramesses and Corner Inversion
题意:
给定两个n*m的矩阵,每次可以选定一个四个点(x1,y1),(x2,y1),(x1,y2),(x2,y2),每次可以让这四个点取反,问可不可以经过若干次操作,使得两个矩阵相等。
题解:
通过观察,每次操作所改变的,都是两行中的四个数,因此,无论执行多少次操作,我们只需判断,两个矩阵每一行不同的数的数量是否整除2,并且每一列需要改变的数是否整除2即可。
/*
* Author: lwktxdy
* Time: 2020-01-26 13:40:07
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<iostream>
#include<sstream>
#include<set>
#include<map>
#include<queue>
#include<bitset>
#include<vector>
#include<limits.h>
#include<assert.h>
#include<bits/stdc++.h>
#define SZ(X) ((int)(X).size())
#define ALL(X) (X).begin(), (X).end()
#define REP(I, N) for (int I = 0; I < (N); ++I)
#define REPP(I, A, B) for (int I = (A); I < (B); ++I)
#define FOR(I, A, B) for (int I = (A); I <= (B); ++I)
#define FORS(I, S) for (int I = 0; S[I]; ++I)
#define RS(X) scanf("%s", (X))
#define SORT_UNIQUE(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end()))))
#define GET_POS(c,x) (lower_bound(c.begin(),c.end(),x)-c.begin())
#define CASET int ___T; scanf("%d", &___T); for(int cs=1;cs<=___T;cs++)
#define MP make_pair
#define PB push_back
#define MS0(X) memset((X), 0, sizeof((X)))
#define MS1(X) memset((X), -1, sizeof((X)))
#define LEN(X) strlen(X)
#define F first
#define S second
using namespace std;
typedef long long ll,LL;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef vector<LL> VL;
typedef vector<PII> VPII;
typedef pair<LL,LL> PLL;
typedef vector<PLL> VPLL;
template<class T> void _R(T &x) { cin >> x; }
void _R(int &x) { scanf("%d", &x); }
void _R(LL &x) { scanf("%lld", &x); }
void _R(double &x) { scanf("%lf", &x); }
void _R(char &x) { scanf(" %c", &x); }
void _R(char *x) { scanf("%s", x); }
void R() {}
template<class T, class... U> void R(T &head, U &... tail) { _R(head); R(tail...); }
template<class T> void _W(const T &x) { cout << x; }
void _W(const int &x) { printf("%d", x); }
void _W(const LL &x) { printf("%lld", x); }
void _W(const double &x) { printf("%.16f", x); }
void _W(const char &x) { putchar(x); }
void _W(const char *x) { printf("%s", x); }
template<class T,class U> void _W(const pair<T,U> &x) {_W(x.F); putchar(' '); _W(x.S);}
template<class T> void _W(const vector<T> &x) { for (auto i = x.begin(); i != x.end(); _W(*i++)) if (i != x.cbegin()) putchar(' '); }
void W() {}
template<class T, class... U> void W(const T &head, const U &... tail) { _W(head); putchar(sizeof...(tail) ? ' ' : '\n'); W(tail...); }
#ifdef HOME
#define DEBUG(...) {printf("# ");printf(__VA_ARGS__);puts("");}
#else
#define DEBUG(...)
#endif
#define Test() int t; cin >> t; while(t--)
#define in freopen("in.txt","r",stdin);
#define out freopen("out.txt","w",stdout);
#define mod 998244353
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
const int maxn = 4e3+5;
char s1[maxn][maxn];
char s2[maxn][maxn];
int a[maxn];
/*
struct node{
}k[maxn];
*/
int main(){
int n,m;
R(n,m);
REPP(i,0,n) REPP(j,0,m) R(s1[i][j]);
REPP(i,0,n) REPP(j,0,m) R(s2[i][j]);
VI v[n];
bool flag = true;
REPP(i,0,n){
REPP(j,0,m){
if(s1[i][j] != s2[i][j]){
v[i].PB(j);
a[j] += 1;
}
}
if(SZ(v[i]) % 2) flag = false;
}
REPP(i,0,501){
if(a[i] % 2){
flag = false;
}
}
if(flag) {
W("Yes");
}
else W("No");
}
/*
2 6
0 0 0 0 0 0
0 0 0 0 0 0
0 0 1 0 1 0
0 0 0 1 0 1
3 4
0 0 0 0
0 0 1 1
1 1 0 0
0 0 1 1
1 1 0 0
0 0 0 0
*/
D.Frets On Fire
题意:
给你n个数组的起点,每个数组的元素是上一个元素+1,数组长度最长到达1e18,有q次询问,每次询问给定l,r,询问下标从l到r所有数组中元素的种类个数。
题解:
数组的顺序并不会改变答案,先对数组起点进行去重排序到数组v。设k = r - l,如果k > 相邻数组起点之叉 - 1,那么,相邻数组可认为是连续的,即两个数组所构成的范围是min(两个数组的起点)~max(两个数组的起点+k)。统计相邻数组构成的差为数组b,排序,计算前缀和方便O(1)计算和,根据输入的k判断有多少个差m满足k>差,假设m为0,那么答案为sum = v[SZ(v)-1] + m - v[0] +1LL,然后根据m的个数,每个m带来的与答案的差值,为c[SZ(b)-1] - c[pos-1] - (SZ(b)-pos) * m,c是前缀和数组,特判pos为0。
AC_CODE
/*
* Author: lwktxdy
* Time: 2020-01-26 13:40:07
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<iostream>
#include<sstream>
#include<set>
#include<map>
#include<queue>
#include<bitset>
#include<vector>
#include<limits.h>
#include<assert.h>
#include<bits/stdc++.h>
#define SZ(X) ((int)(X).size())
#define ALL(X) (X).begin(), (X).end()
#define REP(I, N) for (int I = 0; I < (N); ++I)
#define REPP(I, A, B) for (int I = (A); I < (B); ++I)
#define FOR(I, A, B) for (int I = (A); I <= (B); ++I)
#define FORS(I, S) for (int I = 0; S[I]; ++I)
#define RS(X) scanf("%s", (X))
#define SORT_UNIQUE(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end()))))
#define GET_POS(c,x) (lower_bound(c.begin(),c.end(),x)-c.begin())
#define CASET int ___T; scanf("%d", &___T); for(int cs=1;cs<=___T;cs++)
#define MP make_pair
#define PB push_back
#define MS0(X) memset((X), 0, sizeof((X)))
#define MS1(X) memset((X), -1, sizeof((X)))
#define LEN(X) strlen(X)
#define F first
#define S second
using namespace std;
typedef long long ll,LL;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef vector<LL> VL;
typedef vector<PII> VPII;
typedef pair<LL,LL> PLL;
typedef vector<PLL> VPLL;
template<class T> void _R(T &x) { cin >> x; }
void _R(int &x) { scanf("%d", &x); }
void _R(LL &x) { scanf("%lld", &x); }
void _R(double &x) { scanf("%lf", &x); }
void _R(char &x) { scanf(" %c", &x); }
void _R(char *x) { scanf("%s", x); }
void R() {}
template<class T, class... U> void R(T &head, U &... tail) { _R(head); R(tail...); }
template<class T> void _W(const T &x) { cout << x; }
void _W(const int &x) { printf("%d", x); }
void _W(const LL &x) { printf("%lld", x); }
void _W(const double &x) { printf("%.16f", x); }
void _W(const char &x) { putchar(x); }
void _W(const char *x) { printf("%s", x); }
template<class T,class U> void _W(const pair<T,U> &x) {_W(x.F); putchar(' '); _W(x.S);}
template<class T> void _W(const vector<T> &x) { for (auto i = x.begin(); i != x.end(); _W(*i++)) if (i != x.cbegin()) putchar(' '); }
void W() {}
template<class T, class... U> void W(const T &head, const U &... tail) { _W(head); putchar(sizeof...(tail) ? ' ' : '\n'); W(tail...); }
#ifdef HOME
#define DEBUG(...) {printf("# ");printf(__VA_ARGS__);puts("");}
#else
#define DEBUG(...)
#endif
#define Test() int t; cin >> t; while(t--)
#define in freopen("in.txt","r",stdin);
#define out freopen("out.txt","w",stdout);
#define mod 998244353
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
const int maxn = 4e6+5;
/*
struct node{
}k[maxn];
*/
int main(){
int n;
R(n);
set<ll>a;
FOR(i,1,n){
ll ppp;
R(ppp);
a.insert(ppp);
}
if(SZ(a) > 1){
vector<ll>v;
copy(a.begin(),a.end(),inserter(v,v.begin()));
vector<ll>b;
REPP(i,0,SZ(v)-1){
b.PB(v[i+1] - v[i] - 1LL);
}
//W(b[0]);return 0;
sort(b.begin(),b.end());
vector<ll>c;
c.PB(b[0]);
int ans = 1;
for(; ans < SZ(b); ++ans){
c.PB(c[ans-1] + b[ans]);
}
int q;
R(q);
while(q--){
ll l,r;
R(l,r);
ll m = r - l;
//multiset<ll>::iterator it = lower_bound(b.begin(),b.end(),m);
auto pos = lower_bound(b.begin(),b.end(),m) - b.begin();
//auto pos = distance(b.begin(),it);
//W(pos);
ll sum;
if(pos == 0) sum = c[SZ(b)-1] - (SZ(b)-pos) * m;
else sum = c[SZ(b)-1] - c[pos-1] - (SZ(b)-pos) * m;
//W(SZ(b)-1,ans,pos);
printf("%lld ",v[SZ(v)-1] + m - v[0] + 1LL - sum);
}
}else{
int q;
R(q);
while(q--){
ll l,r;
R(l,r);
printf("%lld ",r-l+1LL);
}
}
}
E.Pavel and Triangles
题意:
给定i根长度为ai的木棍,问最多可以组成多少个三角形,每根木棍只能用一次。
题解:
由于长度是2的次幂,因此,组合成三角形只有两种方法,第一种是三条边相等,第二种是两条边相等加上任意一条比这两条边小的边,因此,从后往前考虑,因为较长的边只有一根时,不能组成三角形,因此,有以下贪心取法,每一种木棍两根两根的取,如果最后剩下一根,则该木棍和自己长度相等的两条木棍组合,最后有sum个两根的集合和ans个三个相等的集合,答案为sum*2/3+ans。
AC_CODE:
/*
* Author: lwktxdy
* Time: 2020-01-26 13:40:07
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<iostream>
#include<sstream>
#include<set>
#include<map>
#include<queue>
#include<bitset>
#include<vector>
#include<limits.h>
#include<assert.h>
#include<bits/stdc++.h>
#define SZ(X) ((int)(X).size())
#define ALL(X) (X).begin(), (X).end()
#define REP(I, N) for (int I = 0; I < (N); ++I)
#define REPP(I, A, B) for (int I = (A); I < (B); ++I)
#define FOR(I, A, B) for (int I = (A); I <= (B); ++I)
#define FORS(I, S) for (int I = 0; S[I]; ++I)
#define RS(X) scanf("%s", (X))
#define SORT_UNIQUE(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end()))))
#define GET_POS(c,x) (lower_bound(c.begin(),c.end(),x)-c.begin())
#define CASET int ___T; scanf("%d", &___T); for(int cs=1;cs<=___T;cs++)
#define MP make_pair
#define PB push_back
#define MS0(X) memset((X), 0, sizeof((X)))
#define MS1(X) memset((X), -1, sizeof((X)))
#define LEN(X) strlen(X)
#define F first
#define S second
using namespace std;
typedef long long ll,LL;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef vector<LL> VL;
typedef vector<PII> VPII;
typedef pair<LL,LL> PLL;
typedef vector<PLL> VPLL;
template<class T> void _R(T &x) { cin >> x; }
void _R(int &x) { scanf("%d", &x); }
void _R(LL &x) { scanf("%lld", &x); }
void _R(double &x) { scanf("%lf", &x); }
void _R(char &x) { scanf(" %c", &x); }
void _R(char *x) { scanf("%s", x); }
void R() {}
template<class T, class... U> void R(T &head, U &... tail) { _R(head); R(tail...); }
template<class T> void _W(const T &x) { cout << x; }
void _W(const int &x) { printf("%d", x); }
void _W(const LL &x) { printf("%lld", x); }
void _W(const double &x) { printf("%.16f", x); }
void _W(const char &x) { putchar(x); }
void _W(const char *x) { printf("%s", x); }
template<class T,class U> void _W(const pair<T,U> &x) {_W(x.F); putchar(' '); _W(x.S);}
template<class T> void _W(const vector<T> &x) { for (auto i = x.begin(); i != x.end(); _W(*i++)) if (i != x.cbegin()) putchar(' '); }
void W() {}
template<class T, class... U> void W(const T &head, const U &... tail) { _W(head); putchar(sizeof...(tail) ? ' ' : '\n'); W(tail...); }
#ifdef HOME
#define DEBUG(...) {printf("# ");printf(__VA_ARGS__);puts("");}
#else
#define DEBUG(...)
#endif
#define Test() int t; cin >> t; while(t--)
#define in freopen("in.txt","r",stdin);
#define out freopen("out.txt","w",stdout);
#define mod 998244353
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
const int maxn = 4e6+5;
char s[maxn];
ll a[maxn];
ll Sum[maxn];
/*
struct node{
}k[maxn];
*/
int main(){
int n;
R(n);
FOR(i,1,n) R(a[i]);
ll sum = 0LL, ans = 0LL;
for(int i=n; i>0; --i){
sum += a[i] / 2;
if(a[i] % 2 && sum){
sum -= 1;
ans += 1;
}
}
W(ans+2*sum/3);
}