15 届蓝桥杯 14 天省赛冲刺营 1 期 - 公平抽签 - 蓝桥云课 (lanqiao.cn)
#include <bits/stdc++.h>
using namespace std;
#define cx first
#define cy second
const int N=20;
typedef pair<int,int> PII;
int vis[N][N]={0};
int cnt=0;
int n,m;
map<int,string>mp;//表示第i个人是mp[i]
//记录顺序的同时记录名字
vector<string>ans;
void dfs(int dep){
//一定要放到dep==n+1前面不然会错
if(cnt==m){//如果够m个人了的话
vector<string>::iterator it=ans.begin();
for(;it!=ans.end();it++){
cout<<(*it)<<' ';
}
cout<<'\n';
return ;
}
if(dep==n+1)return ;
if(cnt>m)return ;
cnt++;
ans.push_back(mp[dep]);
dfs(dep+1);
ans.pop_back();
cnt--;
dfs(dep+1);
}
void solve(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>mp[i];
}
dfs(1);
}
int main(){
int t=1;
while(t--)solve();
return 0;
}
15 届蓝桥杯 14 天省赛冲刺营 1 期 - 座次问题 - 蓝桥云课 (lanqiao.cn)
#include <bits/stdc++.h>
using namespace std;
#define cx first
#define cy second
const int N=20;
typedef pair<int,int> PII;
int vis[N]={0};
int cnt=0;
int n;
map<int,string>mp;//表示第i个人是mp[i]
//记录顺序的同时记录名字
vector<string>ans;
void dfs(int dep){
if(dep==n+1){
vector<string>::iterator it=ans.begin();
for(;it!=ans.end();it++){
cout<<*it<<" ";
}
cout<<'\n';
}
for(int i=1;i<=n;i++){
if(vis[i])continue;
vis[i]=1;
ans.push_back(mp[i]);
dfs(dep+1);
vis[i]=0;
ans.pop_back();
}
}
void solve(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>mp[i];
}
dfs(1);
}
int main(){
int t=1;
while(t--)solve();
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long n = 59084709587505;
int ans = 0;
for(long long i = 1; i <= n; i *= 3)
{
for(long long j = 1; i*j <= n; j *= 5)
{
for(long long k = 1; k*i*j <= n; k *= 7)
{
ans++;
}
}
}
cout << ans - 1;//1不算
return 0;
}
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main(){
string str,strx;
cin>>str;
strx=str;
sort(str.begin(),str.end());
int ans=0;
do {
if(strx==str){
break;
}
ans++;
}while(next_permutation(str.begin(),str.end()));
cout<<ans<<endl;
return 0;
}
#include<cstdio>
#include<algorithm>
#include<string>
using namespace std;
int n,m;
int arr[10005];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",arr+i);
for(int i=1;i<=m;i++)//移动m次
next_permutation(arr+1,arr+1+n);
for(int i=1;i<=n;i++)
printf("%d ",arr[i]);
return 0;
}
//快慢指针例题
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+2;
typedef long long ll;
ll a[N];
int main(){
int n,s;cin>>n>>s;
for(int i=1;i<=s;i++)cin>>a[i];
ll l=1,r=0;//i是左指针 j是右指针
ll ans=n+1;
ll sum=0;
for(int i=1,j=0,sum=0;i<=n;i++){//左指针指向第一个数 而右指针指向第一个数的左边
while(i>j||(j+1<=n&&sum<s)){j++;sum+=a[j];}//或者sum+=a[++j];
//如果区间不合法 或者 右指针还有移动空间并且不满足条件的时候移动右指针
if(sum>=s)ans=1ll*min(ans,1ll*(j-i+1));//更新长度
sum-=a[i];//左指针右移带来的影响
}
cout<<(ans==n+1?0:ans);
return 0;
}