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