超简单的模拟

哭了,PJ难度的大水题我都打了半个小时,我实在是太菜了Orz

现在是真的迷茫,甚至有点害怕了,害怕自己的选择是不是正确的,不知道该不该继续在这条路上走下去,虽然是弱省,但是再怎么说也是TG难度啊,连PJ题都做不来,哭了

所谓青春,并不是一条直路。但不论你走哪一条,那都是你的青春啊。

​ ——《对不起,青春》

题目在这里

贴代码⑧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include<bits/stdc++.h>
#include<stdlib.h>
#define FR(x,k,z) for(register int x = k; x <= z; x++)
#define FFR(x,k,z) for(register int x = k; x < z; x++)
typedef long long int64;

using namespace std;

int main()
{
int a[6016] = {}, b[6016] = {}, an[6016] = {}, bn[6016] = {};//a为每一行被隔开的对数,b为每一列上被隔开的对数
int M, N, K, L, D, x1 = 0, x2 = 0, y1 = 0, y2 = 0;
cin >> M >> N >> K >> L >> D;
FR(i, 1, D)
{
cin >> x1 >> y1 >> x2 >> y2;
if (x1 != x2)//若行不相同,则需要隔开行
{
if (x1 > x2)//隔开x2和x1
b[x2]++;//第x2行需要隔开,同时也说明这行可以隔开的对数
else
b[x1]++;
}
else if (y1 > y2)//若列不相同,隔开列,隔开列后能使多少对人不能说话
a[y2]++;
else
a[y1]++;
}
FR(i, 1, K)//找到被隔开最多人的行数
{
int maxx = 0;
int p = 0;
FR(j, 1, M)
{
if (b[j] > maxx)
{
maxx = b[j];
p = j;
}
}
an[i] = p;
b[p] = 0;
}
FR(i, 1, L)//找到被隔开最多人的列数
{
int maxx = 0;
int p = 0;
FR(j, 1, N)
{
if (a[j] > maxx)
{
maxx = a[j];
p = j;
}
}
bn[i] = p;
a[p] = 0;
}
sort(an, an + K + 1);
FR(i, 1, K)
{
cout << an[i] << ' ';
}
cout << '\n';
sort(bn , bn + L + 1);
FR(i, 1, L)
{
cout << bn[i] << ' ';
}
return 0;
}

这题我想了半天(其实就是懒得用草稿纸),我们用一个数组a存储每一行有多少对人会被隔开,数组b存储每一列绘有多少人被隔开

下面打一个模拟图,1表示人,2表示过道,0表示不说话的人

现在有这么几个人

0 1 1 0

0 1 0 0

0 1 1 0

很显然需要变成这样,才能使他们直接不说话

0 1 2 1

2 2 2 2

0 1 2 0

2 2 2 2

0 1 2 1

我们在原来的地方插入了2行,让他们不说话

我们第一次操作

0 1 1 0

2 2 2 2

0 1 0 0

0 1 1 0

让一对人(两个)不说话,那么我们就记录1列上不能说话的人数,记作b[1]++;

以此类推,后面再加个贪心,很容易能得到正解

问题是

我特么一个高中提高组写这题用了半个小时!

半个小时!

虽然我只学了半年

我哭了,或许我不适合OI吧,以后就随便混个大学读算了(哭唧唧)