D. Extreme Subtraction ###K ###K ###K //K

题目链接:https://codeforces.ml/problemset/problem/1442/A
题意:给定一数组  可以从前缀或者后缀一直减1  问是否能让该数组全部变为零
思路:每次操作是一段的区间操作, 那么考虑转换成差分数组变成单点操作

转换为差分数组后  如果要使得数组中的全部元素为0 那么即 a[i] i~n都为0 

前缀操作的话  是能够 使a[1]-1 并且使得某a[i]+1     后缀操作的话 是可以使得a[n+1]+1   某a[i]-1

所以要使得差分数组为0的话  后缀操作可以随意使用 来确保差分数组中大于0的数全部归0 

而前缀操作则每次付出a[1]-1的代价 使得 差分数组中小于0的数 +1靠近0  所以只需要判断 差分数组中的负数的绝对值是否大于a[1]即可

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define pb push_back
 5 const int maxn =3e4+10;
 6 const int mod=1e9+7;
 7 int a[maxn];
 8 
 9 
10 
11 int main()
12 {
13     ios::sync_with_stdio(false);
14     cin.tie(0);
15     int t;
16     cin>>t;
17     while(t--)
18     {
19         int n;
20         cin>>n;
21         for(int i=1;i<=n;i++)
22         {
23             cin>>a[i];
24         }
25         ll sum=0;
26         for(int i=n;i>=1;i--)
27             a[i]-=a[i-1];
28         for(int i=2;i<=n;i++)
29         {
30             if(a[i]<0)
31                 sum+=abs(a[i]);
32         }
33         if(sum>a[1])
34             cout<<"NO"<<'\n';
35         else
36             cout<<"YES"<<'\n';
37     }
38 
39 
40 
41 
42 }
View Code

 

posted @ 2020-11-06 21:01  canwinfor  阅读(110)  评论(0)    收藏  举报