好妙的差分;
分析1(差分)
设d[]是原数组的差分数组,则最后d[]也是全都为0;
那么两个操作在差分数组上就变成了:
- d[1] --;d[i+1] ++;
- d[i] --;d[n+1] ++;
发现d[n+1] ++是没用的,因此我们可以把d[]中的任意正数用d[i] --变成0;
发现只有d[i+1] ++才能把负数变成0;
所以我们只需要看一下d[1]是否足够后面的所有负数变成>=0就行;
代码1(差分)
int a[maxn];
int d[maxn];
void solve()
{
int n;
cin>>n;
rep(i,1,n) cin>>a[i], d[i] = a[i] - a[i-1];
rep(i,1,n)
if(d[i] < 0) d[1] += d[i];
if(d[1] >= 0) cout<<"YES\n";
else cout<<"NO\n";
}
int main()
{
IOS;
int t;
// ire(t);
cin>>t;
// t = 1;
while(t--)
{
solve();
}
return 0;
}
分析2(贪心)
直接最大化操作1的结果
代码2(贪心)
int n;
int a[maxn];
void solve()
{
cin>>n;
rep(i,1,n) cin>>a[i];
if(n == 1 || n == 2)
{
cout<<"YES\n";
return ;
}
int cnt = a[1];
a[1] = 0;
int flag = 1;
for(int i=2;i<=n;i++)
{
if(a[i] >= a[i-1])
{
cnt = min(cnt,a[i] - a[i-1]);
a[i] -= cnt;
}
else flag = 0;
}
if(flag) cout<<"YES\n";
else cout<<"NO\n";
}
int main()
{
IOS;
int t;
// ire(t);
cin>>t;
// t = 1;
while(t--)
{
solve();
}
return 0;
}