P6714 衰减超简解法!!!(初学者也看得懂!)c++解法

【题目描述】

某种生物大小为整数,随机变异为不超过其大小的一半,当大小为 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;
}

由于这是作者的第一篇文章,所以先写到这了(绝对不是要去玩绝区零。。。)。希望大家能喜欢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值