一.小知识点
二.题目
1>注意:题目保证了输入的都是相邻格。(即牛只在相邻格打架)
所以当行数不相等时,列数一定相等。此时cow[i]++,即这两头牛之间要一个栅栏
当列数不相等时,行数一定相等。此时col[j]++,即这两头牛之间要一个栅栏
2>buf[ i ]:记录每行每列有多少对牛需要隔开。(注意其开辟的内存空间要比col和row大)
3.组成buf时为什么遍历row是1到m-1??
三.代码
#include#include 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 %lldn",t); } else{//k条栅栏 不 可以完全分开牛,输出敌对关系的牛的数量 sort(buf,buf+t); for(i=0;i



