目录
题目描述
输入格式:
输出格式:
输入样例:
输出样例:
分析与题解
题目描述
众所周知,沫沫以火锅为生。在E8的聚餐活动中,他经常卖萌卖无辜领着大家吃火锅,有一天,沫沫听说学校附近的哺呷哺呷在某现充的赞助下有一个优惠活动,只需30软妹币,对每个客人,它会上道菜,但是客人只能挑选其中连续上的一些菜,于是他非常兴奋的拉着灰灰和渣渣去吃火锅去啦,沫沫是一个十分挑食的人,所以他对每一道菜都有一个愉快度(当然因为他的挑食,某些事物的愉快度会是负数),为了让沫沫能非常愉快的享受这次聚餐,善解人意的灰灰和渣渣决定帮他计算,他们应该怎么选择菜才能使沫沫最开心地吃完这次聚餐。
输入格式:
第一行是一个整数表示测试案例的个数;
对于每个测试案例:
第一行是一个整数表示菜的个数;
第二行的个数字,第个数字表示沫沫对第道菜的愉快度。
(沫沫的起始愉快度是0,而且沫沫完全可能得到一个为负值的愉快度值)
输出格式:
对于每个样例,输出一个数字,表沫沫吃完之后愉快度的最大值。
(时间限制:,内存限制:)
输入样例:
2
5
6 -1 5 4 -7
7
0 6 -1 1 -6 7 -5
输出样例:
14
7
14 7
提示:
对于 5 \ 6 -1 5 4 -7,我们选择"6,-1, 5,4"这四道菜(必须是连续的,所以不能跳过-1)
分析与题解
分析:
- 定义变量前考虑愉快度的最小值,并在愉快度最大值为负的情况下得到利用;
- 每输入一次愉快度,就带入实现比较,无需存储,减少内存占用,而且不需要考虑数组的存储能力
- 每加入一道菜后总的愉快度如果为负,则一定不满足条件,于是赋len值为0,从下一道菜开始重新计算愉快度,最终用sum存储当前案例愉快度总和的最大值
- 输出:若最大愉快度总和为负,则输出最大的愉快度即max;若最大愉快度为正,则输出sum(即len的最大值)
代码实现:
# include "stdio.h"
int main()
{
int pleasure = 0; // 每道菜的愉快度
int max = -1001; // PS:最大愉快值最小是-1000
int t = 0; // 菜的个数
int sum = 0, len = 0;
scanf("%d", &t);
while (t--)
{
int n = 0;
scanf("%d", &n); // 接收一组样例中菜的个数
sum = 0, len = 0;
while (n--)
{
pleasure = 0;
scanf("%d", &pleasure);
max = (max < pleasure) ? pleasure : max;
len = (len + pleasure > 0) ? (len + pleasure) : 0;
sum = (sum < len) ? len : sum;
}
// 输出
if (max < 0)
{
printf("%dn", max); // 最大值都是负值,输出max
}
else
{
printf("%dn", sum); // 输出最大愉快度
}
}
return 0;
}
思考:如果的范围是呢?
C语言程序设计(上)_中国大学MOOC(慕课) (icourse163.org)https://www.icourse163.org/learn/BIT-20019?tid=1467043515#/learn/ojhw?id=1240391444



