PTA 乙级 1065 单身狗 (25分) C++

 又是200ms,肯定又有超时检测

思路:创建一个足够大的伴侣二维数组,用来记录每个人的伴侣(二维数组第一位[0])和是否出席(二维数组第二位[1]),输入每个人的伴侣id后,二维数组中对应id储存对方的id

 1 cp[tmp1][0] = tmp2; //记录彼此的伴侣 2 cp[tmp2][0] = tmp1; 

创建一个vector的数组,存储每一个出席的人的id(方便之后统计落单人数),并标记出席人的id的标志位为1,再次对出席人id进行遍历,如果出席人的伴侣id的标志位为0,则为落单的人,落单人数累加,记录落单人id,统计完所有落单人id后,利用sort进行递增排序,输出即可

注意:测试点3,就是在于0这个问题,输出时的格式printf("%05d")输出就可以把id按成5个域宽,从从右向左用0补齐

 1 #include<iostream>
 2 #include<vector>
 3 #include<algorithm>
 4 
 5 using namespace std;
 6 
 7 int cp[100001][2] = { 0 };        //夫妻/伴侣和出席标志位
 8 int dog[10001] = { 0 };            //出席人数中,落单的人
 9 
10 int main() {
11     int n = 0, m = 0;
12     int c = 0;                    //统计落单的人
13     cin >> n;
14     for (int i = 0; i < n; ++i) {
15         int tmp1 = 0, tmp2 = 0;
16         cin >> tmp1 >> tmp2;
17         cp[tmp1][0] = tmp2;        //记录彼此的伴侣
18         cp[tmp2][0] = tmp1;
19     }
20     cin >> m;
21     vector<int> vis(m);
22     for (int i = 0; i < m; ++i) {
23         int tmp = 0;
24         cin >> tmp;
25         cp[tmp][1] = 1;            //标记客人出席
26         vis[i] = tmp;
27     }
28     for (int i = 0; i < m; ++i) {
29         if (cp[cp[vis[i]][0]][1] == 0) {        //客人对应的伴侣的标志位为0
30             dog[c] = vis[i];                    //落单记录
31             c++;
32         }
33     }
34     sort(dog, dog + c);            //对落单的客人进行从小到大的排序
35     cout << c << endl;
36     for (int i = 0; i < c; ++i) {
37         if (i != 0)cout << ' ';
38         printf("%05d", dog[i]);
39     }
40     return 0;
41 }

原文地址:https://www.cnblogs.com/SCP-514/p/13613977.html