【题目描述】
某种生物大小为整数,随机变异为不超过其大小的一半,当大小为 1,再次变异就 只能消失了。求解变异图谱。
【输入数据】
一个数 n,为该生物第一代的大小。
【输出数据】
前面若干行,每行为该生物的变异路径。 最后一行,一个数,为变异的可能情况数。
【输入输出样例】
输入样例:
10
输出样例:
10-1
10-2-1
10-3-1
10-4-1
10-4-2-1
10-5-1
10-5-2-1
7
【数据范围】
N<=200
【解题思路】在考试时,同学们往往会没有足够的时间来完整编写一道题的正解,所以有时只能用打表等方式。但怎么能又省时间又能拿全分的打表方法呢?以下是作者在打模拟赛时的一些思路,供大家参考。
首先,根据题目中的数据范围得,本题中每一次最多只能输出8个数字:200>100>50>25>12>6>3>1.
所以我们用8个嵌套循环就能轻松解决:
上代码!
#include<bits/stdc++.h>
using namespace std;
int n,ans;
int main(){
cin>>n;
for(int i=1;i<=n/2;i++){//共7位
if(i==1){
cout<<n<<"-"<<i<<endl;
ans++;
continue;
}//判断第一位 i
for(int j=1;j<=i/2;j++){
if(j==1){
cout<<n<<"-"<<i<<"-"<<j<<endl;
ans++;
continue;
}//判断第2位 j
for(int k=1;k<=j/2;k++){
if(k==1){
cout<<n<<"-"<<i<<"-"<<j<<"-"<<k<<endl;
ans++;
continue;
}//判断第3位 k
for(int l=1;l<=k/2;l++){
if(l==1){
cout<<n<<"-"<<i<<"-"<<j<<"-"<<k<<"-"<<l<<endl;
ans++;
continue;
}//判断第4位 l
for(int m=1;m<=l/2;m++){
if(m==1){
cout<<n<<"-"<<i<<"-"<<j<<"-"<<k<<"-"<<l<<"-"<<m<<endl;
ans++;
continue;
}//判断第5位 m
for(int o=1;o<=m/2;o++){
if(o==1){
cout<<n<<"-"<<i<<"-"<<j<<"-"<<k<<"-"<<l<<"-"<<m<<"-"<<o<<endl;
ans++;
continue;
}//判断第6位 o
for(int p=1;p<=o/2;p++){
if(p==1){
cout<<n<<"-"<<i<<"-"<<j<<"-"<<k<<"-"<<l<<"-"<<m<<"-"<<o<<"-"<<p<<endl;
ans++;
continue;
}//判断第7位 p
}
}
}
}
}
}
}
cout<<ans;
return 0;
}
以上是比较无赖?的写法,下面上由我们年轻帅气和蔼可亲的老师编写的正解:
#include<bits/stdc++.h>
using namespace std;
int n,ans;
string st;
void d2s(int x,string &s){
stringstream ss;
ss<<x;
ss>>s;
}
void f(int a,const string s1){
if(a==1){
cout<<s1<<"-1"<<endl;
ans++;
return;
}
string s2;
d2s(a,st);
if(a==n){
d2s(a,st);
s2=s1+st;
}
else{
s2=s1+'-'+st;
}
for(int i=1;i<=a/2;i++){
f(i,s2);
}
}
int main(){
// freopen("down.in","r",stdin);
// freopen("down.out","w",stdout);
cin>>n;
string a;
f(n,a);
cout<<ans;
return 0;
}
由于这是作者的第一篇文章,所以先写到这了(绝对不是要去玩绝区零。。。)。希望大家能喜欢!