NYOJ-745蚂蚁的难题(二)

这道题和求字段和的要求就差一点,就是那个是一条链, 这个是个环,关于这么环,刚开始按照链那种方式推倒状态转移方程,但是没有写出来,后来看题解,才看到原来还是转化为普通的单链来做,好多题都是由不会的转化成简单的来做的。还得多思考啊,碰见题就不想动脑子,真是什么都学不了啊

思路:一共有2种,首先是求单链最大值(也就是首尾不相接),这种普通的dp就能求出来,还有就是求单链最小值,用总和减去这个即为除了第一种情况之外的,记住,除了第一种情况能求出来的之外的最大值,刚开始我就是卡到这里了,明明第二种我能找到反例,为什么对呢,后来发现还有一个第一种情况呢,所以最后要比较他们当中谁更大些,选取更大的一个

下面的图示帮忙理解最大值的四种情况。

    第一种          第二种         第三种         第四种

前三种情况都可以用单链的方式求出来,因为就选首尾相接了,也不是最大的,所以前三种情况是第一种,最后一种就是这道题的根本,就像样例第一组数据,3 ,-1, 2,构成最大的在两头,所以这时候要用第二种方法,用第一种求出来的最大值不是最大的,但是求出来的最小值一定是最小的,所以,总的减去最小的,就是最大的,这样这个题就变得简单了

代码如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 using namespace std;
 6 const long long INF = 999999999999999;
 7 const int N = 50000 + 10;
 8 int a[N];
 9 long long min_num, max_num;//保存字段和的最大值与最小值
10 int main()
11 {
12     int n;
13     while (~scanf("%d", &n))
14     {
15         min_num = INF;//初始化
16         max_num = -INF;
17         long long t1 = 0, t2 = 0;
18         long long sum = 0;
19         for (int i = 0; i < n; i++)
20         {
21             scanf("%lld", &a[i]);
22             sum += a[i];
23             if (t1 > 0)
24                 t1 += a[i];
25             else
26                 t1 = a[i];
27             if (t1 > max_num)
28                 max_num = t1;
29             if (t2 < 0)
30                 t2 += a[i];
31             else
32                 t2 = a[i];
33             if (t2 < min_num)
34                 min_num = t2;
35         }
36         if (max_num < sum - min_num)
37             max_num = sum - min_num;
38         printf("%lld\n", max_num);
39     }
40     return 0;
41 }
时间: 2024-10-29 09:42:53

NYOJ-745蚂蚁的难题(二)的相关文章

NYOJ 745 蚂蚁的难题(二)

蚂蚁的难题(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 下雨了,下雨了,蚂蚁搬家了. 已知有n种食材需要搬走,这些食材从1到n依次排成了一个圈.小蚂蚁对每种食材都有一个喜爱程度值Vi,当然,如果Vi小于0的时候,表示蚂蚁讨厌这种食材.因为马上就要下雨了,所以蚂蚁只能搬一次,但是能够搬走连续一段的食材.时间紧急,你快帮帮小蚂蚁吧,让它搬走的食材喜爱值和最大. 输入 有多组测试数据(以EOF结尾).每组数据有两行,第一行有一个n,表示有n种食材排成了一个圈.(

NYOJ-745 蚂蚁的难题(二)【动态规划】

蚂蚁的难题(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 下雨了,下雨了,蚂蚁搬家了. 已知有n种食材需要搬走,这些食材从1到n依次排成了一个圈.小蚂蚁对每种食材都有一个喜爱程度值Vi,当然,如果Vi小于0的时候,表示蚂蚁讨厌这种食材.因为马上就要下雨了,所以蚂蚁只能搬一次,但是能够搬走连续一段的食材.时间紧急,你快帮帮小蚂蚁吧,让它搬走的食材喜爱值和最大. 输入 有多组测试数据(以EOF结尾). 每组数据有两行,第一行有一个n,表示有n种食材排成了一个圈.

NYOJ 625 笨蛋的难题(二)

笨蛋的难题(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 笨蛋就业了,并且是在上千应聘中脱颖而出的,和他一起脱颖而出的还有傻子.公司的老板对二人视为珍宝,为了激励他们的工作热情,给他们一小时发一次工资(很高兴吧).但每次只发给一个人,并且每次发的工资可能不同(老板很厉害吧).傻子和笨蛋为了证明自己比对方智商高,他们事先知道每次发的工资的多少.他们暗中达成协议:他们不是将工资平分,而是轮流领取.该领工资的人可以选择跳过一个或多个小时的工资,而领取后面的工资.跳

蚂蚁的难题(二)

蚂蚁的难题(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 下雨了,下雨了,蚂蚁搬家了. 已知有n种食材需要搬走,这些食材从1到n依次排成了一个圈.小蚂蚁对每种食材都有一个喜爱程度值Vi,当然,如果Vi小于0的时候,表示蚂蚁讨厌这种食材.因为马上就要下雨了,所以蚂蚁只能搬一次,但是能够搬走连续一段的食材.时间紧急,你快帮帮小蚂蚁吧,让它搬走的食材喜爱值和最大. 输入 有多组测试数据(以EOF结尾). 每组数据有两行,第一行有一个n,表示有n种食材排成了一个圈.

NYOJ 744 蚂蚁的难题(一)

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=744 标准水题目..找规律即可.. 题解: 找规律水题,任取两组数即可,如4,8.计算得这个区间异或最大值为7^8=15=(1111)2=2^4-1; 再任意找一组数2,6,计算得这个区间异或最大值为2^5=7=(111)2=2^3-1; 通过上述分析可得知最大值为2^n-1,而n正是右边界的数的二进制位数. #include <stdio.h> int main() { long l

蚂蚁的难题(二)首尾相连数组的最大子数组和(DP)

蚂蚁的难题(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 下雨了,下雨了,蚂蚁搬家了. 已知有n种食材需要搬走,这些食材从1到n依次排成了一个圈.小蚂蚁对每种食材都有一个喜爱程度值Vi,当然,如果Vi小于0的时候,表示蚂蚁讨厌 这种食材.因为马上就要下雨了,所以蚂蚁只能搬一次,但是能够搬走连续一段的食材.时间紧急,你快帮帮小蚂蚁吧,让它搬走的食材喜爱值和最大. 输入 有多组测试数据(以EOF结尾). 每组数据有两行,第一行有一个n,表示有n种食材排成了一个圈

NYOJ 745 蚂蚁问题(两)

蚂蚁的难题(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描写叙述 下雨了,下雨了.蚂蚁搬家了. 已知有n种食材须要搬走,这些食材从1到n依次排成了一个圈.小蚂蚁对每种食材都有一个喜爱程度值Vi,当然,假设Vi小于0的时候,表示蚂蚁讨厌这样的食材.由于立即就要下雨了.所以蚂蚁仅仅能搬一次,可是可以搬走连续一段的食材.时间紧急,你快帮帮小蚂蚁吧,让它搬走的食材喜爱值和最大. 输入 有多组測试数据(以EOF结尾). 每组数据有两行.第一行有一个n,表示有n种食材排成了

nyoj 747 蚂蚁的难题(三)

蚂蚁的难题(三) 时间限制:2000 ms  |  内存限制:65535 KB 难度:4 描述 蚂蚁终于把尽可能多的食材都搬回家了,现在开始了大厨计划. 已知一共有 n 件食材,每件食材有一个美味度 Ai 和新鲜度 Bi , 如果蚂蚁在第t时刻将第i样食材烹饪成功,则得到Ai-t*Bi 的美味指数,当然,用第i件食材做饭要花去 Ci 的时间. 众所周知,蚂蚁的厨艺不怎么样,所以他需要你设计做饭方案使得在时间 T 内完成的美味指数最大. 输入 有多组测试数据. 第一行是两个正整数,表示蚂蚁的做饭时

nyoj 744 蚂蚁的难题(一)

蚂蚁的难题(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 小蚂蚁童鞋最近迷上了位运算,他感觉位运算非常神奇.不过他最近遇到了一个难题: 给定一个区间[a,b],在区间里寻找两个数x和y,使得x异或y最大.来,帮帮他吧! 输入 有多组测试数据(以EOF结尾). 每组数据输入两个数a,b.(0<=a<b<2^63) 输出 输出a到b之间,异或最大的值. 样例输入 1 2 8 9 样例输出 3 1 思路:  多进行数据测试发现:每次的输出结果为2^n -

环状最大和子序列 ---- 蚂蚁的难题(二)

求环状最大和子序列  方法是    先求出 不循环的情况下的 最大和子序列 , 和最小和子序列  ,  然后 所有数字的和-最小和子序列 和 最大和自序列里面找一个 最大值 就是  最终的最大值 http://115.159.40.116/problem_show.php?pid=5543 1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #i