Acwing 1209.带分数(暴力枚举+递归全排列)
第一次相对自主写出来的一道算法题!!!!!!!!!!!
ohohohoohohohoho~~~~~~~~~~~~~~~~~~~
想哭555555555555555555
铭记此刻......
题目

解题思路
//1.使用全排列1~9的数字
//2.再把1~9分割成3部分,a,b,c target(1<N<1e6)
//3.做判断是否等于目标数字
1.感觉也没什么东西,就是用之前学的,递归实现排序型枚举,把1~9所有的可能写出来,
2.然后在根据题目给的N<100000,使得第一部分要小于7位数(i<6),然后要给最后一部分至少留有1位数所以第二部分的右边界要用j<8
3.为了防止整数相除四舍五入,要使用a*c+b==target*c 来作判断.
代码
#include<iostream>
using namespace std;
bool used[10];
int target,count,num[10];
//1.使用全排列1~9的数字
//2.再把1~9分割成3部分,a,b,c target(1<N<1e6)
//3.做判断是否等于目标数字
//把存在数组中的三部分整理为三个整数
int calc(int l,int r){
int res=0;
for(int i=l;i<=r;i++){
res=res*10+num[i];
}
return res;
}
//全排列分成三部分,然后检测是否相等
void dfs(int u){
if(u==9){
//把分成三部分的每一种可能全部排列出来
for(int i=0;i<6;i++){
for(int j=i+1;j<8;j++){
int a=calc(0,i);
int b=calc(i+1,j);
int c=calc(j+1,8);
//a+b/c==target 但是防止整数四舍五入
if(a*c+b==target*c) count++;
}
}
}
//全排列
for(int i=1;i<=9;i++){
if(!used[i]){
num[u]=i;
used[i]=true;
dfs(u+1);
used[i]=false;
}
}
}
int main(){
cin>>target;
dfs(0);
cout<<count<<endl;
return 0;
}
使用<algorthm> next_permutation() 函数进行全排列
#include<bits/stdc++.h>
using namespace std;
bool used[10];
int target,num[10];
//1.使用全排列1~9的数字
//2.再把1~9分割成3部分,a,b,c target(1<N<1e6)
//3.做判断是否等于目标数字
//把存在数组中的三部分整理为三个整数
int calc(int l,int r){
int res=0;
for(int i=l;i<=r;i++){
res=res*10+num[i];
}
return res;
}
int main(){
cin>>target;
//全排列分成三部分,然后检测是否相等
for(int i=0;i<9;i++)num[i]=i+1;
int count=0;
do{
//把分成三部分的每一种可能全部排列出来
for(int i=0;i<6;i++){
for(int j=i+1;j<8;j++){
int a=calc(0,i);
int b=calc(i+1,j);
int c=calc(j+1,8);
//a+b/c==target 但是防止整数四舍五入
if(a*c+b==target*c) count++;
}
}
// //全排列
// for(int i=1;i<=9;i++){
// if(!used[i]){
// num[u]=i;
// used[i]=true;
// dfs(u+1);
// used[i]=false;
// }
// }
// }
}while(next_permutation(num,num+9));
cout<<count<<endl;
return 0;
}
.
2291

被折叠的 条评论
为什么被折叠?



