codeforcesC. Posterized

题目链接:C. Posterized

题目意思:

给出n个数字,每个数字都在[0,255]中,将这些数分组,每组长度不能超过k。每个组不能有重复区间,组内得元素用改组得key代表,输出n个数字使得字典序最小,那么key 肯定选择最小得数字。

思路:

用贪心,先设置一个标记数组a[256],初始化-1,对应位置得值表示key。从最左边开始,往前搜素,从最远开始搜素,(l,x),l=max(0,x-k+1);只要发现有一点得值是-1或是本身就说明从这开始成组。(-1得话就表示没被分组过,从前往后搜肯定是最小得啦!如果是本身,说明这个数前面刚好已经成一组了,那么这个也是最小得左边界了。)将该区域得key都设置为i就完事了!

代码

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n,k,a[260],i,j;
    cin>>n>>k;
    for(i=0;i<260;++i)a[i]=-1;
    while(n--){
        int temp;
        cin>>temp;
        if(a[temp]==-1)
        {
        int l=max(0,temp-k+1);
        for(i=l;i<=temp;++i){
            if(a[i]==-1||a[i]==i){
                for(j=i;j<=temp;++j)a[j]=i;
                break;
            } 
        }
    }
            if(n!=0)
            cout<<a[temp]<<" ";
            else cout<<a[temp];
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/PinappleMi/article/details/80254085