TLE50分求助
查看原帖
TLE50分求助
372653
yaozhijiandeyeye楼主2020/10/31 23:13

大号评测记录:https://www.luogu.com.cn/record/40963972

#include<bits/stdc++.h>
using namespace std;
int n,k;
int a[10001],vis[10001],comb[10001];
void dfs(int dep)
{
	if(dep==n+1)
	{
		int flag=0;
		for(int i=1;i<=k-1;i++)//把全排列筛选成组合数 
		{
			if(a[i]>a[i+1])//组合数的特征 
			{
				flag=1;
			}
		}
		int flagn;
		for(int i=1;i<=k;i++)//判断和上一位是否重复 
		{
			if(a[i]==comb[i])
			{
				flagn=1;
			}
			else
			{
				for(int i=1;i<=k;i++)
				{
					comb[i]=a[i];
				}
				flagn=0;
			}
		}
		if(!flag&&!flagn&&a[0]<=k)//如果没有上一位大于下一位的,且第一位(数最大的那位)要求小于k 
		{
			for(int i=1;i<=k;i++)
			{
				printf("%3d",a[i]);
			}
			printf("\n");
		}
		else
		{
			return;
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(vis[i])//枚举出全排列 
        {
            continue;
		}
        a[dep]=i;
        vis[i]=true;
        dfs(dep+1);
        vis[i]=false;
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>k;
	for(int i=1;i<=k;i++)
	{
		cout<<"  "<<i;
	}
	cout<<"\n";
	dfs(1);
}

怎么优化

2020/10/31 23:13
加载中...