带分数【全排列】
思想:
题意是用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;
}