0
点赞
收藏
分享

微信扫一扫

湘潭大学大二下程序设计实践oj题 1408 Cow(矩阵中的公牛有冲突,设置最小的隔离线--->贪心算法)

罗蓁蓁 2022-05-05 阅读 45

一.小知识点

二.题目

        1>注意:题目保证了输入的都是相邻格。(即牛只在相邻格打架)

                         

                        所以当行数相等时,列数一定相等。此时cow[i]++,即这两头牛之间要一个栅栏

                               当列数相等时,行数一定相等。此时col[j]++,即这两头牛之间要一个栅栏

        2>buf[ i ]:记录每行每列有多少对牛需要隔开。(注意其开辟的内存空间要比col和row大)

        3.组成buf时为什么遍历row是1到m-1??

三.代码

#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 111
#define X 111111
int main()
{
	int T;
	scanf("%d",&T);
	while(T--){
		//TODO
		ll n,m,p,k,i,j,x1,y1,x2,y2;
		scanf("%lld %lld %lld %lld",&n,&m,&p,&k);
		ll row[N]={0},col[N]={0};//记录在第i和i+1行相邻 和 在第j和j+1列 相邻的牛的数量
		for(i=1;i<=p;i++){
			//TODO
			scanf("%lld %lld %lld %lld",&x1,&y1,&x2,&y2);
			x2=max(x1,x2);
			x1=min(x1,x2);
			y2=max(y1,y2);
			y1=min(y1,y2);
			if(x2!=x1){//在第i行!
				row[x1]++;
			}
			if(y2!=y1){//在第j列!
				col[y1]++;
			}
		}
		ll buf[X]={0};
		ll t=0,sum=0;
		for(i=1;i<=m-1;i++){//???
			if(row[i]>0) buf[t++]=row[i];	
		}	
		for(i=1;i<=n-1;i++){
			if(col[i]>0) buf[t++]=col[i];
		}
		if(t<=k){//k条栅栏可以完全分开牛,打架的牛的对数为0,再输出需要建立的最少的栅栏数。
			printf("0 %lld\n",t);
		}
		else{//k条栅栏 不 可以完全分开牛,输出敌对关系的牛的数量
			sort(buf,buf+t);
			for(i=0;i<t-k;i++){
				sum+=buf[i];
			}
			printf("%lld\n",sum);
		}
		
	}
	return 0;
}

举报

相关推荐

0 条评论