本人不熟c++,但是想用c++自带函数(sort,max等),所以c++和混用了......
#include<iostream>
#include<algorithm>
#include <cstring>
using namespace std;
int m, n, k, le, d;
int x[2020], y[2020], p[2020], q[2020], a[2020], b[2020], h[2020], s[2020];
int main()
{
int num1 = 0, num2 = 0;
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
cin >> m >> n >> k >> le >> d;
for (int i = 1; i <= d; i++)
{
scanf("%d %d %d %d", &x[i], &y[i], &p[i], &q[i]);//读取坐标
if (y[i] == q[i])//当纵坐标相等时
{
a[num1 + 1] = min(x[i], p[i]);//a[],b[]数组存储每一条通道能分开同学的对数
num1++;
}
if (x[i] == p[i])//横坐标相等
{
b[num2 + 1] = min(y[i], q[i]);
num2++;
}
}
sort(a + 1, a + num1 + 1);//排序的话方便后面从小到大输出
sort(b + 1, b + num2 + 1);
for (int i = 1; i <= num1; i++)
h[a[i]]++;
for (int i = 1; i <= num2; i++)
s[b[i]]++;
for (int i = 1; i <= k; i++)
{
int* ma = max_element(h + 1, h + a[num1]+1);//每一次选出分开同学对数最多的通道,并设为-1
for (int j = 1; j <= num1; j++)
{
if (*ma == h[a[j]])
{
h[a[j]] =-1;
break;
}
}
}
for (int i = 1; i <= num1; i++)//遇到-1就输出,为什么要这样而不是找到最多就输出,(题目说了从小到大)
if (h[a[i]] == -1&&a[i]>a[i-1])
printf("%d ", a[i]);
printf("\n");
for (int i = 1; i <= le; i++)
{
int *ma = max_element(s + 1, s + b[num2]+1);
for (int j = 1; j <= num2; j++)
{
if (*ma == s[b[j]])
{
s[b[j]] = -1;
break;
}
}
}
for (int i = 1; i <= num2; i++)//小插曲,原来num2被写为了b[num2],输出有问题,因为遍历的是s[b[i]].
if (s[b[i]] == -1&&b[i]>b[i-1])
printf("%d ", b[i]);
return 0;
}
ws的改进:很棒就对了
#include<iostream>
#include<algorithm>
#include <cstring>
using namespace std;
int m, n, k, le, d;
int x, y, p, q, h[2020], s[2020];
int main()
{
int num1 = 0, num2 = 0;
cin >> m >> n >> k >> le >> d;
for (int i = 1; i <= d; i++)
{
scanf("%d %d %d %d", &x, &y, &p, &q);//读入的四个坐标只用一次就没用了,所以不用开数组全存起来
if (y==q)h[min(x,p)]++;
else s[min(y,q)]++;//其实a,b也用不到,也不用排序,这里就直接把h和s数组搞定
}
for (int i = 1; i <= k; i++)
{
int* ma = max_element(h + 1, h + m+1);//找到最大的地址
*ma=-1;//通过指针取值就可以直接修改,因为它返回的本就是需要修改的元素的地址,不需要一个一个找
}
for (int i=1;i<=m; i++)
if (h[i] == -1)
printf("%d ", i);
printf("\n");
for (int i = 1; i <=le; i++)
{
int* ma = max_element(s + 1, s + n+1);
*ma=-1;
}
for (int i=1;i<=n;i++)
if (s[i] == -1)
printf("%d ", i);
return 0;
}