
这道题目本想照抄老师的代码蒙混过关,结果老师的代码WA了。
emm~这就很难受了,调试了好一会才发现老师的代码没有分析好ans值转换的条件。
导致有些数据会直接将最大值输出出来,而不是mid的中间值。
题目大意:有N天的花费,和M个预算段,要求把N天分成M个预算段,在满足花费的前提下,使得M个预算段的预算额最小。
思路:大致是二分法查找符合的最大值,最后输出即可,当然中间还要对答案进行限制一手。
预算值 上界的是sum(Ci) 下界是max(Ci)
显然预算值越大,分得的段数越少
二分预算值,检验段数是否为M 求下限
老师的代码如下(省略头文件):

再其次好考虑清楚M等于N的情况(就将总值输出即可)(尽管不考虑好像也可以过)
最后代码如下:
#include <stdio.h>
int main()
{
int i,j;
int x,num;
scanf("%d %d",&x,&num);
int arr[100001];
int max=0,min=-1;
for(i=0;i<x;i++)
{
scanf("%d",&arr[i]);
max+=arr[i];
if(arr[i]>min)min=arr[i];//求出max与min的上下限制
}
if(x==num)
{
printf("%d\n",max);//天数相同时直接输出max
return 0;
}
int mark,mid,sum;
while(max>min)
{
mid=(max-min)/2+min;
mark=1,sum=0;
for(i=0;i<x;i++)
{
sum+=arr[i];
if(sum>mid)sum=arr[i],mark++;
}
if(mark>num)min=mid+1;
else max=mid;//判断mid赋值给谁
}
printf("%d\n",min);
return 0;
}
注:如果数据过大,max累加可能会RE,也可以直接设max为一个比较大的数
文章讲述了作者在解决一个编程问题时遇到的困难,涉及到如何使用二分法寻找满足预算段数的最小总花费,以及在代码中处理特殊情况如M=N的情况。通过实例分析了代码逻辑和边界条件,提示了避免溢出的方法。
3273

被折叠的 条评论
为什么被折叠?



