- 题意:一个序列含有1~n的数,构造一个排列方式使得这个序列的最长上升子序列的长度与最长下降子序列的长度的和最小。
1。寄几的代码:
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
const int N=1e5+6;
int n,a[N],res=1e9,tot,cnt,ans[N],L[N],R[N],B[N],sqr,T=10;
void init(){
memset(L,0,sizeof(L));memset(R,0,sizeof(R));
memset(B,0,sizeof(B));
}
int main(){
cin>>n;sqr=sqrt(n);
for(int i=-5;i<=5;i++){
int x=i+sqr;
if(x<=0||x>n)continue;
init();
for(int i=1;i<=n;i++){
tot=B[i]=(i-1)/x+1;
if(!L[B[i]])L[B[i]]=i;R[B[i]]=i;
}
for(int i=1,cnt=n;i<=tot;i++)
for(int j=R[i];j>=L[i];j--)a[j]=cnt--;
if(tot+x<res)memcpy(ans,a,sizeof(ans)),res=tot+x;
}
for(int i=1;i<=n;i++)cout<<ans[i]<<" ";
}
2。大神的代码:
#include<iostream>
using namespace std;
int main(){
int n,t=1;cin>>n;
while(t*t<n)t++;
while(n>0){
int x=((n-1)/t)*t;
for(int i=x+1;i<=n;i++)cout<<i<<" ";
n=x;
}
}

334

被折叠的 条评论
为什么被折叠?



