蓝桥杯算法训练题目列表
ALGO-1 区间k大数查询
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string.h>
#include<stdio.h>
using namespace std;
int a[1005];
int tmp[1005];
int ans[1005];
bool cmp(int a,int b)
{
return a>b;
}
int maxsort(int l,int r,int val)
{
memset(tmp,0,sizeof(tmp));
int i=l;int j=1;
for(;i<=r;i++,j++)
tmp[j]=a[i];
sort(tmp+1,tmp+r-l+1+1,cmp);
return tmp[val];
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int m;
cin>>m;
for(int k=1;k<=m;k++)
{
int l,r,val;
cin>>l>>r>>val;
//cout<<a[]
cout<<maxsort(l,r,val)<<endl;
}
// for(int i=1;i<=m;i++)
// cout<<ans[i]<<endl;
return 0;
}
ALGO-3 K好数
DP策略就是从局部到整体,dp[i][j]代表的是位长为i,并且首位是j时状态的总方案数,那么如何用dp[i-1]推到dp[i]呢?
策略如下:由题意得两个相邻位数其值不想邻,我们只需要剔除这种情况即可;
打个比方:设k=3,l=3 如何表示长度为3的方案数呢?
我们得到下面等式:总方案数由下面相加:dp[3][0],dp[3][1],dp[3][2]
并且:
dp[3][0]=dp[2][2]
dp[3][1]=0
dp[3][2]=dp[2][0]
我们决定长度为3时的首位数,然后剔除相邻的情况,拓展到长度为2的情况;
#include <iostream>
#include<cstdio>
using namespace std;
#define MOD 1000000007
int dp[105][105];
int main()
{
int k,l;
cin>>k>>l;
for(int i=0;i<k;i++)
dp[1][i]=1;
for(int i=2;i<=l;i++)
for(int j=0;j<k;j++)
for(int m=0;m<k;m++){
if(j!=m+1&&j!=m-1)
{
dp[i][j]+=dp[i-1][m];
dp[i][j]%=MOD;
}
}
int sum=0;
for(int i=1;i<k;i++)
{
sum+=dp[l][i];
sum%=MOD;
}
cout<<sum<<endl;
return 0;
}