给定n个数字,你需要从中选出一些连续的数字,让这些数的和尽量大。
但是选出的数必须都大于等于x,小于等于y,且这些数不能超过z个
输入描述:
第一行输入一个整数t,代表有t组测试数据,
对于每组测试数据,
第一行输入4个整数n,x,y,z,意义如题所示
第二行输入空格隔开n个数a[i],表示连续的n个数
1<=t<=10
1<=n<=1*10^5
1<=x<=y<=1*10^9
1<=z<=n
1<=a[i]<=1*10^9
输出描述:
对于每组测试数据,输出一个整数代表能得到的最大和是多少
并且对于每组数据,答案占单独的一行。
示例
输入:
1
10 2 6 3
2 7 2 3 3 3 1 3 5 7
输出:
9
在这里插入代码片
#include<stdio.h>
int main()
{
int i,t; //t 检测次数
scanf("%d",&t);
int n,x,y,z; //n数的个数,x 最小值,y 最大值 ,z 不超过的个数
int j,J;
int sum=0,count=0;
int num[100000];
int max;
for(i=0;i<t;i++)
{
scanf("%d %d %d %d",&n,&x,&y,&z); //输入n,x,y,z
for(j=0;j<n;j++)
{
scanf("%d",&num[j]);
} //输入每个数
for(j=0;j<n;j++)
{
if(num[j]>=x&&num[j]<=y)
{
max=num[j];
break;
}
} //第一个在范围中的数为max,以方便以后的比较大小;
for(j=0;j<n;j++)
{
J=j;
sum=0;
for(count=0;count<z;count++)
{
if(num[J]>=x&&num[J]<=y)
{
sum=sum+num[J];
J++;
}
else break;
} /*对在范围中的连续的z个数求和,
如果在z个数内有数不在范围内,求和提前结束;
如果不在范围中判断下一个数*/
if(sum>max)
max=sum;
}
printf("%d\n",max);
}
return 0;
}
总结:
1.仔细读题,不能只读大意,必要时不能错过每一个字。
2.当条件多时,可以给条件分类,列出每个条件得到的效果,如果效果相同或类似,可以将这些条件放在一个条件语句中。
3.如果在循环中每次循环会产生一个数,这个数需要比较,但难以计算有几个数,可以设一个数,且给予它一个初值,在循环中比较,使用数组会增加难度