CF864D Make a Permutation!

思路:

贪心,构造,模拟。

实现:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int t[200005], a[200005], vis[200005], n;
 4 int main()
 5 {
 6     while (cin >> n)
 7     {
 8         memset(t, 0, sizeof t); memset(vis, 0, sizeof vis);
 9         int cnt = 0;
10         for (int i = 0; i < n; i++) 
11         {
12             cin >> a[i]; t[a[i]]++;
13             if (t[a[i]] > 1) cnt++;
14         }
15         cout << cnt << endl;
16         queue<int> q;
17         for (int i = 1; i <= n; i++) if (!t[i]) q.push(i);
18         for (int i = 0; i < n; i++)
19         {
20             if (!t[a[i]]) continue;
21             else if (t[a[i]] == 1 && !vis[a[i]]) 
22             {
23                 cout << a[i] << " "; t[a[i]]--;
24             }
25             else 
26             {
27                 if (vis[a[i]]) 
28                 {    
29                     cout << q.front() << " "; q.pop(); 
30                 }
31                 else if (q.front() < a[i])
32                 {
33                     cout << q.front() << " "; q.pop(); 
34                 }
35                 else 
36                 {
37                     cout << a[i] << " "; vis[a[i]] = 1;
38                 }
39                 t[a[i]]--;
40             }
41         }
42         cout << endl;
43     }
44     return 0;
45 }

 

转载于:https://www.cnblogs.com/wangyiming/p/7631703.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值