牛客练习赛114 D题题解

比赛编号太臭了

题目链接

对一第一组数据,我们形象化的得到下图:

image

如何拆解使其变成一个“顺子”呢,我们像这样:

image

贪心的从后往前取,对于取数列时的终点也就是枚举的起点如果不为 0 ,就向前一直取,如果取到一个数 \(x\)发现这个数的个数 \(num_x\)是大于\(num_{x - 1}\)的,就停止,最后看拆出来的数列长度是否都大于等于 5 。


void work()
{
	cin >> n;
    for(int i = 1; i <= n; i++)
        num[i] = 0;
    for(int i = 1; i <= n; i++)
    {
        int x = read();
        num[x]++;
    }
	for(int i = n; i >= 1; i--)
    {
       while(num[i])
       {
        	int cnt = 0;
        	for(int j = i; j >= 1; j--)
        	{
            	num[j]--;
      	      	cnt++;
            	if(num[j - 1] < num[j] + 1)
                	break;
        	}
        	if(cnt < 5)
        	{
            	printf("NO\n");
            	return;
        	}
       	}
    }
    printf("YES\n");
	return;
}

posted @ 2023-08-25 21:34  six_one  阅读(56)  评论(0编辑  收藏  举报