2021.3.27天梯赛补题报告
L2-029 特立独行的幸福
这个题有些复杂,但分开步骤逐个击破好像并不难搞。题意是找到特立独行的数字从小到大输出,特立独行:首先是幸福数,可以迭代到一,并且在给定区间内不依附于其他数字,即不是其他数字迭代得到的。把这题分成几个步骤:1.首先找到幸福数,设一个函数ff(n)用以迭代,看其是否可以得到一 2.再把迭代得到的数放进一个数组b[nl]内(注意只存放迭代得到的数,原数不放在里面),用以特例性判断,即使不能迭代得到一,数组也可以不清空(发生段错误,可以尝试扩张数组大小,清空数组也没用)3.把初步满足条件的数放进另一个数组c[nl]内,其特例性放进d[nl]里面 4.最后判断c[i]==b[j]?,如果否,则会c[i]可以输出.
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll nl=1e6+5;//当时写的是1e5+5,结果发生段错误
ll b[nl]={0},a[nl],c[nl],d[nl],e[nl];
ll ff(ll n){//判断是否幸福
ll sum=0;
while(n!=0){
sum+=(n%10)*(n%10);
n/=10;
}
return sum;
}
int main(){
ll n,m;
cin>>n>>m;
ll num=0;
ll i,j,k,jl=0,zl=0,kl=0,il;
for(i=m;i>=n;i--){
ll x=i,f=0,fl=0;
j=0;
for(k=2;k<=sqrt(i);k++){
if(i%k==0){
fl=1;
break;
}
}
zl=jl;
while(1){
a[j]=x;
j++;
x=ff(x);
if(x==1){
break;
}
b[jl]=x;//用于判断特例性
jl++;
for(k=0;k<j;k++){
if(x==a[k]){
f=1;
break;
}
}
if(f==1){
break;
}
}
if(f==0){
ll fff=0;
if(fl==0){
c[kl]=i;
d[kl]=j*2;
kl++;
num++;
}else{
c[kl]=i;
d[kl]=j;
kl++;
num++;
}
}
}
for(i=0;i<kl;i++){//判断是否特例性
for(j=0;j<jl;j++){
if(c[i]==b[j]){
c[i]=0;
}
}
}
if(num==0){
cout<<"SAD";
}else{
for(i=kl-1;i>=0;i--){
if(c[i]!=0){
cout<<c[i]<<" "<<d[i]<<endl;
}
}
}
}
L2-031 深入虎穴
这个题要找最远出口,入口只有一个,遍历一下各个门通向的门,没有门通向的门就是入口。运用dfs算法,定义一个dfs函数,找到最远的那条路即可。
dfs算法:利用递归遍历每一个门的所有通路,找到最远的路。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll nl=1e5+5;
int D=0,ans;
bool flag[nl];
vector<int>v[nl];
void dfs(int x,int d){
if(v[x].size()==0){
if(d>=D){
D=d;
//cout<<D<<endl;
ans=x;
}
}
for( int i=0;i<v[x].size();i++){//错误点:此时i 必须如此定义,比如说 你i现在是 1 ,然后dfs,本来dfs完了以后,下一次i应该是2了对吧,但是你这个递归里,还要用i 说不定就不知道变成什么值了
dfs(v[x][i],d+1);
}
}
int main(){
ll n;
cin>>n;
ll i,j;
for(i=1;i<=n;i++){
ll k;
cin>>k;
while(k--){
ll m;
cin>>m;
flag[m]=1;
v[i].push_back(m);
}
}
ll ru;
for(i=1;i<=n;i++){
//for(j=0;j<v[i].size();j++){
//cout<<v[i][j]<<endl;
//}
if(flag[i]==0){
ru=i;
break;
}
}
dfs(ru,0);
cout<<ans<<endl;
}
浙公网安备 33010602011771号