HDU 4377 - Sub Sequence

来源:互联网 发布:易语言黑客源码 编辑:程序博客网 时间:2024/05/10 06:34

 

题目地址:  http://acm.hdu.edu.cn/showproblem.php?pid=4377

 

2012年多校  , 第8场, 1008 。

 

方法: 。。。。 我可以说找规律么。。。。

 

首先想到的是 12348765 这种排法,后来发现有点不对,找到了一个反例。。。

 

于是在一个小时之后,找到了正确排法:  4,3,2,1,8,7,6,5,12,11,10,9,16,15,14,13 。

 

就是说,先将最长下降自序列排好,并且分堆,如 4,3,2,1 是第一堆,8开头第二堆,12开头第三堆,16开头第四堆 。

 

 然后再对下降子序列堆 排成 上升序列,如 4开头,8开头,12开头,16开头 。

 

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<queue>#include<map>#include<vector>using namespace std;const int inf = 0x7fffffff;const __int64 inf64 = (__int64)inf*inf;int main(){int t,i,j,nn,n,kk,k,f;scanf("%d",&t);while(t--){scanf("%d",&n);if(n==2){puts("1 2");continue;}nn=sqrt((double)(n-1))+1;k=(n-1)/nn;f=0;for(i=1;i<=n;i++){if(k+i>=nn) break;if(f) printf(" %d",i);else{printf("%d",i); f=1;}}if(i<=n){kk=(n-i+1)%nn;for(j=i+kk-1;j<=n;j+=nn){for(k=j;k>=i;k--){if(f) printf(" %d",k);else{printf("%d",k); f=1;}}i=j+1;}}puts("");}return 0;}


 

 

原创粉丝点击