|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
输入
第一行是整数R,表示大矩形的右上角坐标是(R,R) (1 <= R <= 1,000,000)。
接下来的一行是整数N,表示一共有N个小矩形(0 < N <= 10000)。
再接下来有N 行。每行有4个整数,L,T, W 和 H, 表示有一个小矩形的左上角坐标是(L,T),宽度是W,高度是H (0<=L,T <= R, 0 < W,H <= R). 小矩形不会有位于大矩形之外的部分。
输出
输出整数n,表示答案应该是直线 x=n。 如果必要的话,x=R也可以是答案。
样例输入 复制
1000
2
1 1 2 1
5 1 2 1
样例输出 复制
5
#include <stdio.h>
int calculate_area_diff(int N,int L[],int W[],int H[],int k)
{//计算两个面积之差
int area_left=0,area_right=0,i;
//N为矩形个数,L为矩形左上角横坐标,W为矩形的宽度,H为矩形高度,直线x=k
for (i = 0;i < N;i++){//总共有N个矩形,判断N个矩形与直线x=k的位置关系
if (L[i] + W[i] <= k){//如果矩形的最右侧都在直线x=k的左侧
area_left += W[i] * H[i];
}
else if (L[i] >= k){//如果矩形的最左侧都在直线x=k的右侧
area_right += W[i] * H[i];
}
else{//如果矩形在直线的左右两侧
area_left += (k-W[i]) * H[i];//左侧的面积
area_right += (W[i]+L[i]-k) * H[i];//右侧的面积
}
}
return area_left-area_right;
}
int max_found(int R,int N,int L[],int W[],int H[])
{//找到面积之差的最大值从而返回直线x=k中k的值
int left = 0;//设置二分查找左右两边的范围
int right = R;//大矩形的坐标为(R,R)
int mid;
//比较中间值mid两边的面积之差来逼近最优解
int diff = calculate_area_diff(N,L,W,H,mid);
while (left < right){
mid = (left+right) / 2;
if (diff > 0) {
left = mid + 1;
}
else {
right = mid;
}
}
return left;//返回直线的值
}
int main(void)
{
int R,N,i,j,k;
int rectangle[100][4];
scanf("%d%d",&R,&N);
for (i = 0;i < N;i++){
for (j = 0;j < 4;j++){
scanf("%d",&rectangle[i][j]);
}
}
k = max_found(R,N,rectangle[0],rectangle[2],rectangle[3]);
printf("%d",k);
return 0;
}
请问这个程序哪里有问题?
这个程序存在一些问题,主要集中在calculate_area_diff和max_found两个函数上。
首先,在calculate_area_diff函数中,有一个逻辑错误。当计算矩形与直线x=k的位置关系时,应该考虑矩形与直线的交点情况。但在当前的实现中,并没有正确考虑矩形与直线的相交情况。需要对相交情况进行正确处理,以确保计算面积之差的准确性。
其次,在max_found函数中,存在一些问题。在二分查找的过程中,计算了diff = calculate_area_diff(N,L,W,H,mid),但是在接下来的循环中,并没有更新diff的值。实际上,应该在每次更新mid之后重新计算diff,以便根据不同情况调整左右边界。此外,还应该考虑当left等于right时的退出条件。
另外,在main函数中,传递给max_found函数的参数有误。应该传递矩形数组的地址而不是第一个矩形的地址。
如果你需要我对程序进行修改,请告诉我具体的需求,我会很乐意帮助你。
|
|