枚举与双指针

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;
}

1.第几个幸运数字 - 蓝桥云课 (lanqiao.cn) 

#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;
}

1.排列序数 - 蓝桥云课 (lanqiao.cn) 

#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;
}

1.火星人 - 蓝桥云课 (lanqiao.cn) 

#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;
}

1.美丽的区间 - 蓝桥云课 (lanqiao.cn) 

//快慢指针例题 
#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;
}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值