10分求助(玄关)
  • 板块P1904 天际线
  • 楼主hayoon
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/4/21 07:57
  • 上次更新2024/4/21 07:58:12
查看原帖
10分求助(玄关)
915383
hayoon楼主2024/4/21 07:57
#include<bits/stdc++.h>
using namespace std;
#define N 510
int d[N][N];
int f[N][N];
int s[N][N];
int n[N];
int num[N];
int daoa[N];
int suma[N];
int numa=0,numb=0;
int main()
{
	int r,c,a,b;
	scanf("%d%d%d%d",&r,&c,&a,&b);
	for(int i=1; i<=r; i++) {
		for(int j=1; j<=c; j++) {
			scanf("%d",&d[i][j]);
			f[i][j]=f[i][j-1]+d[i][j];
		}
	}
	for(int i=1; i<=r; i++) {
		num[i]=1;
		for(int j=1; j<=r; j++) {
			if(f[j][c]>f[i][c])
				num[i]++;
		}
	}
	int sum=0;
	for(int i=1; i<=a-1; i++) {
		int pd=0;
		for(int j=2; j<=r-1; j++) {
			if(sum==a-1) {
				pd=1;
				break;
			}
			if(num[j]==i) {
				if(j==1 || j==r) {
					if(j==1 && daoa[1]==0)
						daoa[1]=1,sum++;
					if(sum==a-1) {
						pd=1;
						break;
					}
					if(j==r && daoa[r-1]==0)
						daoa[r-1]=1,sum++;
					if(sum==a-1) {
						pd=1;
						break;
					}
				} else {
					if(daoa[j-1]==0)
						daoa[j-1]=1,sum++;
					if(sum==a-1) {
						pd=1;
						break;
					}
					if(daoa[j+1]==0)
						daoa[j+1]=1,sum++;
					if(sum==a-1) {
						pd=1;
						break;
					}
				}
			}
		}
		if(pd==0)
			break;
	}
	memset(s,0,sizeof(s));
	int num1=0;
	suma[++num1]=f[1][c];
	for(int i=1; i<=c; i++)
		s[num1][i]+=d[1][i];
//	for(int i=1;i<=num1;i++)
//	{
//		for(int j=1;j<=c;j++)
//		printf("%d ",s[i][j]);
//		printf("\n");
//	}
//	printf("________________\n");
	for(int i=1; i<=r-1; i++) {
		if(daoa[i]==0) {
			suma[num1]+=f[i+1][c];
			for(int j=1; j<=c; j++)
				s[num1][j]+=d[i+1][j];
		} else {
			suma[++num1]+=f[i+1][c];
			for(int j=1; j<=c; j++)
				s[num1][j]+=d[i+1][j];
		}
//		for(int i=1;i<=num1;i++)
//		{
//			for(int j=1;j<=c;j++)
//			printf("%d ",s[i][j]);
//			printf("\n");
//		}
//		printf("________________\n");
	}

	if(b==1) {
		int minn=INT_MAX;
		for(int i=1; i<=num1; i++) {
			if(suma[i]<minn)
				minn=suma[i];
		}
		printf("%d\n",minn);
		return 0;
	}
	int minn=INT_MAX;
	for(int i=1; i<=num1; i++) {
		double e=suma[i]*1.0/b;
		int sumx=0;
		int h=0;
		for(int j=1; j<=c; j++) {
			sumx+=s[i][j];
			if(j==c)
				minn=min(sumx,minn);
			else {
				if(sumx*1.0>=e) {
					minn=min(minn,sumx);
					sumx=0;
				}
			}
		}
	}
	printf("%d",minn);
	return 0;
}

调了3个小时 崩溃了

2024/4/21 07:57
加载中...