1.B2 Books Exchange (hard version)
题意:有n(1~n)个孩子看书,定义一个数组,记录了每个孩子看完??,把书给的下一个人
T个样例,输出孩子重新拿到自己的书需要的传递次数
思路:easy : i=a[ i ] ;直到 i ==本身,记录次数
hard : 递归找环 ,运用递归,减少遍历次数,就是说一次递归把环上的所有点的次数全部找到。
#include<bits/stdc++.h> using namespace std; const int MA=2e5+5; int a[MA]; int book[MA]; //递归找环 int solve(int init,int now,int next,int step){ if(init==next) return book[now]=step; else return book[now]=solve(init,next,a[next],step+1); } int main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); int n,t; cin>>t; while(t--){ memset(book,0,sizeof(book)); cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++){ if(book[i]==0){ solve(i,i,a[i],1); } } for(int i=1;i<n;i++){ cout<<book[i]<<" "; } cout<<book[n]<<endl; } return 0; }
int solve(int init,int now,int next,int step){ if(init==next) return book[now]=step; else return book[now]=solve(init,next,a[next],step+1); }
原文地址:https://www.cnblogs.com/w-w-t/p/11743427.html
时间: 2024-10-09 01:28:32