C++蓝桥杯历届试题(附代码)

带分数【全排列】

在这里插入图片描述
思想:
题意是用bfs搜索,我是枚举出1~9这9个数字的全排列,然后截取成带分数的3部分,判断这个带分数是否等于给定的数即可。

c++有自带的求全排列的函数next_permutation(beg,end),其中参数beg、end分别表示序列的头尾迭代器,这个函数按照字典序给出给定序列的下一个排列,如果序列已经是最后一个排列,则next_permutation将序列重排为最小的排列,并返回false;否则返回true。

#include<stdio.h>
#include<algorithm>
#include<iostream>
#define ll long long
using namespace std;
const int N=100010;
int number[9];//全排列

int count(int l,int r){  //计算分割开来的数
    int cou=0;
    for(int i=l;i<=r;i++)
        cou=cou*10+number[i];
    return cou;
}

int main(){
    int ans=0;
    int n;
    cin>>n;
    for(int i=0;i<9;i++){
        number[i]=i+1;
    }
    do{
        //for(int i=0;i<9;i++)cout<<number[i];
        //cout<<endl; //输出全排列的
        for(int i=0;i<7;i++){
             for(int j=1+1;j<8;j++){
                  int a=count(0,i);int b=count(i+1,j);int c=count(j+1,8);
                  if((a+b/c)!=n||b%c!=0)continue;
                  ans++;
             }
        }
    }while(next_permutation(number,number+9));
    cout<<ans<<endl;
    return 0;
}

错误票据

传送门
题目:
在这里插入图片描述
由于输入有行数要求,故可以用字符串来读取每行,然后以空格为分界点进行读取各个数字。

关键的点就是atoi()函数的使用 atoi—ASCII to integer,将字符串转换成整形,从数字或正负号开始转换,一直到非数字为止

更多关于atoi()和itoa()等类似函数用法详解见博客:整型与字符串转换函数atoi和itoa函数详解

在数据量比较小的情况下可以借鉴下桶排序的思想,开辟一个整型数组(num),用来标记读取到的每一个数,记录其出现的次数,初始化全为0,故m既是数组值为0所对应的下标,n即是数组值为2所对应的下标。

代码参考于:https://blog.csdn.net/eagle_or_snail/article/details/62439327

AC代码

#include <stdio.h>
#include <string.h>
#include <string>
#include <utility>
#include <iostream>
#include <cstdlib>
const int MAXN = 100010;
using namespace std;

int num[MAXN];
char s[10];//存空格间的数字
int main(){
    int n,l,r,a;
    int max_=0;
    scanf("%d\n",&n);
    memset(num,0,sizeof(num));
    for (int e = 0; e < n; ++e)
    {
        char tmp[400];//存每一行
        gets(tmp);
        int id=0;
        for(int i=0;i<strlen(tmp);i++){
            if(tmp[i]==' '){
                a=atoi(s);//空格间的数字,第一次s就是第一个“ ”前的数字
                id=0;
                memset(s,0,sizeof(s));//重新清空数组
                num[a]++;
                //cout<<a<<endl;
                max_=max(a,max_);//记录最大值
            }
            s[id++]=tmp[i];//“ ”前的数字加入s
        }
        a=atoi(s);//最后一个数字
        id=0;
        memset(s,0,sizeof(s));
        num[a]++;
        //cout<<a<<endl;
        max_=max(a,max_);
    }
    int k;
    for(k=0;k<=MAXN;k++){
        if(num[k]!=0)break;//把前面没有的数字先跑过去
    }
    //cout<<k<<endl;;
    for(k;k<=max_;k++){
        if(num[k]==0)l=k;
        if(num[k]==2)r=k;
    }
    cout<<l<<" "<<r<<endl;        
    return 0;
}
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值