2016-第七届蓝桥杯大赛个人赛省赛(软件类)真题 C大学A组


假如是有重复元素的全排列怎么办呢?

在dfs枚举每个位置的时候 加一个判断条件 如果这个位置上枚举的数字以前这个位置用过 那就跳过

点击查看代码
//有重复的全排列
#include<cstdio> 
#include<algorithm> 
using namespace std; 
const int MN=105; 
int a[MN],n,x,ans[MN],l; 
bool vis[MN]; 
void print() 
{ 
    for(int i=1;i<=n;i++) 
        printf("%d ",ans[i]); 
    printf("\n"); 
} 
void dfs(int k) 
{ 
    if(k>n) {print();return;} 
    int last=-1; 
    for(int i=1;i<=n;i++) 
        if(vis[i]==false&&a[i]!=last) 
            vis[i]=true,ans[k]=a[i],last=a[i],dfs(k+1),vis[i]=false; 
} 
int main() 
{ 
    scanf("%d",&n); 
    for(int i=1;i<=n;i++) 
        scanf("%d",&a[i]); 
    sort(a+1,a+n+1); 
    dfs(1); 
    return 0; 
} 

不用多说 x&(x-1)

不多说 全排列判断 因为是填空题 所以跑的很慢也没事

不多说 还是一个dfs 我发现蓝桥杯好喜欢考dfs

我感觉依次开方然后减掉开方后的再平方 依次操作四次
正确性我不知道正不正确

就是一道dp题目

dp[i,j] 表示使得区间[i,j] 变为回文串所需删除的最少字符

初始状态 dp[i,i]=0;

转移:如果 s[i]==s[j] dp[i,j]=dp[i-1,j-1]
如果 s[i]!=s[j] dp[i,j]=min(dp[i+1,j],dp[i,j-1])+1

这是唯一一道感觉有难度的题目

首先排序加去重 同时除以最小的数 这样就可以把数列的a0消掉了

然后对第一个数 对它开n次方 然后依次判断

对于开n次方 是可以预处理 i的n次方的 10的10次方就已经1e10了

最后用map存一下就好

posted @ 2022-03-30 10:16  wzx_believer  阅读(41)  评论(0)    收藏  举报