codeforces 1017C The Phone Number [分块+贪心]

题目链接

题意:给你一个数n,让你给出一个有n个数的排列,这n个数分别是1到n,求一个最长上升子序列和最长递减子序列的长度和最小的排列。

题解:通过样例1可以看出只要n是某个整数的平方,那么可以将其分为sqrt(n)块,每一块为sqrt(n)个,那么夹杂在
(n-1)^2 和 n^2 的数该如何方块呢,为何方块就是因为如果方块进行排列:那么每个块以内按递增进行排列,块与块之间按递减排列,
块数+我们所规划好的每块所包含的数量,就是我们要求的结果, 即最小长度和,所以进行一个判断:

如果n无法整除,那么根据n的大小分为 (int)sqrt(n)块 或 (int)sqrt(n)+1块, 每一块都有 (int)sqrt(n)+1 个数

 

#include<bits/stdc++.h>
using namespace std;
int main() {
	int n;
	while(~scanf("%d", &n)) {
		int a = (int)sqrt(n);
		int dls, lis;
		if(a*a == n) {
			dls = a;
			lis = a;
		} else if(a*(a+1) >= n) {
			dls = a;
			lis = a+1;
		} else {
			dls = a+1;
			lis = a+1;
		}
		for(int i=0; i<dls; i++) {
			for(int j=0; j<lis; j++) {
				int x=(dls-i-1)*lis+j;
				if(x<n) {
					printf("%d ",x+1);
				}
			}
		}
		printf("\n");
	}
	return 0;
}

 

 

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-01 17:13
想去,但是听说加班强度实在难崩,所以拒绝了,现在有点心梗对面hr感觉也是实习生,打电话的时候怪紧张的,但是感觉人很好嘞
水中水之下水道的鼠鼠:哥们这不先去体验一下,不行再跑呗,大不了混个实习经历(有更好的转正offer就当我没说)
点赞 评论 收藏
分享
鬼迹人途:你去投一投尚游游戏,服务器一面,第一个图算法,做完了给你一个策略题,你给出方案他就提出低概率问题,答不上当场给你挂
点赞 评论 收藏
分享
06-12 17:46
门头沟学院 Java
运营你豪哥:来说重点: ​1.项目前置,时间倒序。​​ 2.​项目描述强化结果与量化效果(STAR原则里的R)。​​ ​3.个人技能精炼,明确掌握程度,突出核心。​​ ​4.增加强有力开头的个人总结部分。​​ 5.​优化教育背景(成绩排名)、合并奖项与活动。​​
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务