NYOJ745-蚂蚁的难题(二)
2014-04-14 10:47
246 查看
蚂蚁的难题(二)
[align=center]时间限制:1000 ms | 内存限制:65535 KB[/align][align=center]难度:3[/align]
描述
下雨了,下雨了,蚂蚁搬家了。
已知有n种食材需要搬走,这些食材从1到n依次排成了一个圈。小蚂蚁对每种食材都有一个喜爱程度值Vi,当然,如果Vi小于0的时候,表示蚂蚁讨厌这种食材。因为马上就要下雨了,所以蚂蚁只能搬一次,但是能够搬走连续一段的食材。时间紧急,你快帮帮小蚂蚁吧,让它搬走的食材喜爱值和最大。
输入有多组测试数据(以EOF结尾)。
每组数据有两行,第一行有一个n,表示有n种食材排成了一个圈。(2 <= n<= 50000)
第二行分别有n个数,代表蚂蚁对第n种食材的喜爱值Vi。(-10^9 <= Vi <= 10^9)输出输出小蚂蚁能够搬走的食材的喜爱值总和的最大。样例输入
3 3 -1 2 5 -8 5 -1 3 -9
样例输出
5 7
这是我在看了讨论区里思路之后写的。
思路:此题是连续最大子串和(NYOJ44)的变形,只是改成一个环状而已。由于数据量大,用枚举起点+原来的求子串和的代码是两重循环,必定超时。 其实它只是在原来的情况上多加了一种首位相接情况,所以只需先求出首尾不相连时的最大和max1,然后求出首位相连时的最大和max2,取两者的最大值即可。max2的求法其实和max1的求法差不多,试想一下一个环,你要是求得了首尾不相连时的最小和min ,那么剩下的数就是首尾相接时的最大和!所以max2等于所有元素的和减去首尾不相连时的最小和min。
#include<cstdio> #include<cstring> #define Max(a,b) a>=b?a:b #define Min(a,b) a<=b?a:b const int N=50000+10; long long int a ,f1 ,f2 ; int main() { int n; while(~scanf("%d",&n)) { memset(f1,0,sizeof(f1)); memset(f2,0,sizeof(f2)); int i,j,v; long long int max,min,sum=0; for(i=0;i<n;i++) { scanf("%d",&v); sum+=v; if(0==i) { max=v; min=v; } f1[i+1]=Max(f1[i]+v,v); f2[i+1]=Min(f2[i]+v,v); max=Max(f1[i+1],max); min=Min(f2[i+1],min); } max=Max(max,sum-min); printf("%lld\n",max); } return 0; }另外看到了NYOJ44的优秀代码,这里也一起贴上来
#include<stdio.h> int main() { int n,m,v,max,sum; scanf("%d",&n); while(n--) { sum=0; scanf("%d",&m); scanf("%d",&sum); max=sum; while(--m) { scanf("%d",&v); if(sum<0) sum=v; else sum+=v; if(sum>max) max=sum; } printf("%d\n",max); } }
相关文章推荐
- nyoj--745--蚂蚁的难题(二)
- NYOJ 745 蚂蚁的难题(二)
- NYOJ-745 蚂蚁的难题(二)【动态规划】
- NYOJ 745 蚂蚁的难题(二)
- NYOJ 题目745 蚂蚁的难题(二)(dp)
- nyoj745_蚂蚁的难题(二)
- nyoj 745 蚂蚁的难题(二)
- NYoj745 蚂蚁的难题(二)
- NYOJ 745 蚂蚁的难题(二)
- NYOJ 745 蚂蚁的难题(二)
- NYOJ - 745 - 蚂蚁的难题(二)(最大子序列和变形,动态规划)
- Nyoj 745 蚂蚁的难题(二)
- NYOJ-745蚂蚁的难题(二)
- nyoj 蚂蚁的难题(二)745
- nyoj745蚂蚁的难题(二)【dp】
- nyoj745-蚂蚁的难题(二)
- nyoj 745蚂蚁的难题(二)
- NYOJ-745(动态规划)---蚂蚁的难题(二)
- NYOJ 745 蚂蚁的难题(二)
- nyoj--745--蚂蚁的难题(二)