codeforce 379C New Year Ratings Change 题解

题目连接: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;
}



你可能感兴趣的:(codeforce 379C New Year Ratings Change 题解)