ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

动态规划:Educational Codeforces Round 123 (Rated for Div. 2)C. Increase Subarray Sums (最大连续区间和)

2022-04-15 09:35:19  阅读:157  来源: 互联网

标签:Educational ch int sum Sums long flag Rated include


C. Increase Subarray Sums

传送门:Problem - 1644C - Codeforces

 

 

 

  题目大意就是:给你一个序列,算出序列和为sum,求是否有连续区间和大于等于sum,有就输出NO,否则YES,并且连续区间不能是[1,n],也就是整个序列,我的思路就是构建两个DP数组,既然区间不能是1->n,那么一个dp从1->n-1,第二个从2->n,求dp[i],i代表以i结尾的区间的最大连续区间和,有大于等于sum的直接输出NO,最后都没有的话就输出YES。本质上就是一个最大连续区间和的问题。

  上代码:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #include<map>
 6 using namespace std;
 7 const int maxn = 1e5 + 5;
 8 const int inf = -0x7FFFFFFF;
 9 long long a[maxn];
10 long long dp1[maxn];
11 long long dp2[maxn];
12 long long read()
13 {
14     long long x = 0, f = 1;
15     char ch = getchar();
16     if (ch > '9' || ch < '0')
17     {
18         f = -1;
19         ch = getchar();
20     }
21     while (ch >= '0' && ch <= '9')
22     {
23         x = (x << 3) + (x << 1) + ch -'0';
24         ch = getchar();
25     }
26     return x * f;
27 }
28 long long max(long long a, long long b)
29 {
30     if (a > b)
31         return a;
32     else return b;
33 }
34 int main()
35 {
36     long long t;
37     t = read();
38     while (t--)
39     {
40         long long n;
41         n = read();
42         long long sum = 0;
43         for (int i = 0; i <= n; ++i)dp1[i] = inf, dp2[i] = inf;
44         for (int i = 1; i <= n; ++i)
45         {
46             a[i] = read();
47             sum += a[i];
48         }
49         bool flag = 0;
50         for (int i = 1; i < n; ++i)
51         {
52             dp1[i] = max(dp1[i - 1], 0) + a[i];
53             if (dp1[i] >= sum)
54             {
55                 flag = 1;
56                 break;
57             }
58 
59         }
60         if (!flag)
61         {
62             for (int i = 2; i <= n; ++i)
63             {
64                 dp2[i] = max(dp2[i - 1], 0) + a[i];
65                 if (dp2[i] >= sum)
66                 {
67                     flag = 1;
68                     break;
69                 }
70             }
71         }
72         if (flag)cout << "NO"<<endl;
73         else cout << "YES"<<endl;
74         
75     }
76     return 0;
77 
78 }

0X7FFFFFFF代表INT最小的。挺好用的,一般定义为inf。

 

标签:Educational,ch,int,sum,Sums,long,flag,Rated,include
来源: https://www.cnblogs.com/zhuzhucheng/p/16147543.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有