题目连接:http://codeforces.com/problemset/problem/379/C
把带重复值的数列A变成没有重复值的新数列B,要求新的数列的总和是所有可行解中最小的,而且新的数列任何一个值都不能小于A数列中对应的值。
思路:
1 先把A数列排序,同时使用pair,或者自定义的stuct,记录好数值和下标的对应关系
2 然后从A数列最小的值开始填到B数列,第一个最小的值直接填到B就可以了。
3 然后把A数列当前的值和上一个填写值比较,填写较大值到B数列中。
4 利用好记录了的下标就可以快速定位需要填写在B数列中的那个位置了。
#include <stdio.h> #include <vector> #include <string.h> #include <algorithm> #include <iostream> #include <string> #include <limits.h> #include <stack> #include <queue> #include <set> #include <map> using namespace std; const int MAX_N = (int)3E5+1; pair<int,int> arr[MAX_N]; int a2[MAX_N]; int main() { int n; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &arr[i].first); arr[i].second = i; } sort(arr, arr+n); int c = arr[0].first; a2[arr[0].second] = c; for (int i = 1; i < n; i++) { if (arr[i].first <= c) a2[arr[i].second] = ++c; else a2[arr[i].second] = (c = arr[i].first); } for (int i = 0; i < n; i++) { printf("%d ", a2[i]); } return 0; }