AC代码
#include<bits/stdc++.h>
using namespace std;
int maxn(int a[]){//找最大值 找(能分开的对数)最多的那条线 返回它的下标
int index=0;
for(int i=0;i<1001;++i){
if(a[i]>a[index]){
index=i;
}
}
a[index]=0;//找完这个最大的,把它变成0,下一次找次大的
return index;
}
int m1[1005],m2[1005],h[1005],s[1005];
int main(){
int m,n,k,l,d;
int x1,y1,x2,y2;
scanf("%d%d%d%d%d",&m,&n,&k,&l,&d);
for(int i=0;i<d;++i){
cin>>x1>>y1>>x2>>y2;
if(x1==x2) m1[min(y1,y2)]++;//m1[竖线坐标]++ m2存储这个坐标的竖线能分开同学的的对数
else m2[min(x1,x2)]++;//横线
}
for(int i=0;i<k;++i){
h[i]=maxn(m2);//找(分开的同学对数前k多)的竖线
}
for(int i=0;i<l;++i){
s[i]=maxn(m1);
}
sort(h,h+k);//坐标按从小到大输出
sort(s,s+l);
for(int i=0;i<k-1;++i) printf("%d ",h[i]);
cout<<h[k-1]<<"\n";
for(int i=0;i<l-1;++i) printf("%d ",s[i]);
cout<<s[l-1]<<"\n";
}
方法2 桶标记 实现从小到大输出
#include<bits/stdc++.h>
using namespace std;
int maxn(int a[]){
int index=0;
for(int i=0;i<1001;++i){
if(a[i]>a[index]){
index=i;
}
}
a[index]=0;
return index;
}
int m1[1005],m2[1005],h[1005],s[1005];
int main(){
int m,n,k,l,d;
int x1,y1,x2,y2;
scanf("%d%d%d%d%d",&m,&n,&k,&l,&d);
for(int i=0;i<d;++i){
cin>>x1>>y1>>x2>>y2;
if(x1==x2) m1[min(y1,y2)]++;
else m2[min(x1,x2)]++;
}
for(int i=0;i<k;++i){
int in=maxn(m2);
h[in]=true;
}
for(int i=0;i<l;++i){
int in=maxn(m1);
s[in]=true;
}
for(int i=0;i<=1000;++i){
if(h[i]) printf("%d ",i);
}
printf("\n");
for(int i=0;i<=1000l;++i){
if(s[i]) printf("%d ",i);
}
return 0;
}
疑惑待解:
这一行移到main函数外变成全局变量,编译就通不过,而且编译信息只针对y1
int x1,y1,x2,y2;//这一行移到main函数外变成全局变量,编译就通不过,而且编译信息只针对y1
疑惑解答(+5h):
y1和C++库里的标识符重名了,起名要慎重!解决方法:好像不用 using namespace std 就可以了。