Codeforces Round #480 (Div. 2)980C Posterized+分组类贪心

传送门:http://codeforces.com/contest/980/problem/C

参考

题意:给定n个数字,每个数在0~256间,现在给至多连续k的数分为一组,给出字典序最小的答案。

思路:贪心,对于每一个a[i],查找max(0,a[i] - k + 1)到 a[ i ] 中符合vis[ t ] ==t || vis[ t ] = -1的最小数字 T ,把这个T到 a[ i ]间的更新为T;

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+9;
const int  inf = 0x3f3f3f3f;
int n,k;
int a[maxn],vis[maxn];
int d[maxn];
int main(){
    scanf("%d%d", &n,&k);
    for(int i=1; i<=n; i++)
        scanf("%d", &a[i]);
    memset(vis,-1,sizeof(vis));
    for(int i=1;i <= n; i++)
    {
        if(vis[a[i]]!=-1)
            printf("%d%c",vis[a[i]]," \n"[i==n]);
        else 
        {
            int j;
            int tot = 0;
            for(j = max(0,a[i] - k + 1); j<=a[i]; j++)
            {
                if(vis[j] == -1||vis[j] == j)
                {
                    break;
                }
                
            }
            for(int g = j;g<=a[i];g++)
            {
                vis[g] = j;
            }
            printf("%d%c",vis[a[i]]," \n"[i==n]);
        }
    }
    return 0;
}
CF980C

猜你喜欢

转载自www.cnblogs.com/ckxkexing/p/9090547.html