一.小知识点
二.题目
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;
}