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 }
默默地一点点变强,细节决定成败