A. The Doors
分析
水题,题目要找的是一段序列的最后一个0或1的下标中小的那个,直接记录后输出小的就行了.
代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include <cstdio> 2 #include <cmath> 3 #include <iostream> 4 #include <cstring> 5 #include <algorithm> 6 #include <vector> 7 #include <string> 8 #include <utility> 9 #include <queue> 10 #include <stack> 11 #include <map> 12 #include <set> 13 const int INF=0x3f3f3f3f; 14 using namespace std; 15 16 int main() 17 { 18 // freopen("in.txt","r",stdin); 19 // freopen("out.txt","w",stdout); 20 int a=0,b=0,n; 21 cin>>n; 22 for(int i=0;i<n;i++) 23 { 24 int x;scanf("%d",&x); 25 if(x==0) a=i+1; 26 if(x==1) b=i+1; 27 } 28 int ans=min(a,b); 29 cout<<ans<<endl; 30 return 0; 31 }
B. Nirvana
分析
随便举例一个数分析一下,设x=1895462,按题意只需从1*8*9*5*4*6*2,1*8*9*5*4*(6-1)*9,1*8*9*5*(3-1)*9*9,1*8*9*(4-1)*9*9*9,1*8*(9-1)*9*9*9*9,1*(8-1)*9*9*9*9*9,9*9*9*9*9*9中找最大值即可,这里需要注意的是最后一位1-1=0的时候,就不需要*0了,还有如果是第i位(不是最后以为)且num[i]-1<=0,num[i]表示第几位数,则可以跳过这一步.
代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include <cstdio> 2 #include <cmath> 3 #include <iostream> 4 #include <cstring> 5 #include <algorithm> 6 #include <vector> 7 #include <string> 8 #include <utility> 9 #include <queue> 10 #include <stack> 11 #include <map> 12 #include <set> 13 const int INF=0x3f3f3f3f; 14 using namespace std; 15 16 int num[20]; 17 18 int main() 19 { 20 // freopen("in.txt","r",stdin); 21 // freopen("out.txt","w",stdout); 22 long long n; 23 cin>>n; 24 long long k=n; 25 int cnt=0; 26 while(k) 27 { 28 num[cnt++]=k%10; 29 k/=10; 30 } 31 long long ans=0; 32 for(int i=0;i<cnt;i++) 33 { 34 long long sum=1; 35 if(i) 36 { 37 if(num[i]-1<=0&&i!=cnt-1) continue; 38 if(num[i]-1<=0&&i==cnt-1) cnt--; 39 num[i]-=1; 40 for(int j=0;j<i;j++) num[j]=9; 41 } 42 for(int j=0;j<cnt;j++) sum*=num[j]; 43 ans=max(sum,ans); 44 } 45 cout<<ans<<endl; 46 return 0; 47 }
C. Queen
分析
这道题需要查找出本节点c值1是且儿子节点全都是1的节点,把树的边存起来,用dfs进行搜索就行.
代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include <cstdio> 2 #include <cmath> 3 #include <iostream> 4 #include <cstring> 5 #include <algorithm> 6 #include <vector> 7 #include <string> 8 #include <utility> 9 #include <queue> 10 #include <stack> 11 #include <map> 12 #include <set> 13 using namespace std; 14 const int INF=0x3f3f3f3f; 15 16 vector<int> v[100001]; //装边 17 int c[100001]; 18 int ans[100000]; //用来装要删的数 19 int cnt=0; //用来控制ans数组 20 21 int dfs(int x) 22 { 23 int s=1; 24 for(int i=0;i<v[x].size();i++) 25 { 26 if(!dfs(v[x][i])) s=0; 27 } 28 if(c[x]&&s) ans[cnt++]=x; 29 return c[x]; 30 } 31 32 int main() 33 { 34 // freopen("in.txt","r",stdin); 35 // freopen("out.txt","w",stdout); 36 int n; 37 cin>>n; 38 int s; //记录树根 39 for(int i=1;i<=n;i++) 40 { 41 int x;scanf("%d%d",&x,&c[i]); 42 if(x==-1) 43 { 44 s=i; 45 continue; 46 } 47 else v[x].push_back(i); 48 } 49 /* for(int i=1;i<=n;i++) 50 { 51 printf("%d:",i); 52 for(int j=0;j<v[i].size();j++) 53 printf("%d ",v[i][j]); 54 cout<<"------"<<c[i]; 55 cout<<endl; 56 } 57 */ dfs(s); 58 if(cnt) 59 { 60 sort(ans,ans+cnt); 61 for(int i=0;i<cnt-1;i++) 62 printf("%d ",ans[i]); 63 printf("%d\n",ans[cnt-1]); 64 } 65 else cout<<-1<<endl; 66 return 0; 67 }
D. The Beatles
分析
假已经知道每次走l km,则到达s起点需要的步数为n*k/(gcd(n*k,l)),设l=k*x+c,当给定a,b时,c只有两种可能(a+b),|a-b|,举个例子,这里假设a=4,b=2,k=8,1代表s,2代表第一走l步后的位置,-1代表餐馆,
1 0 2 0 -1 0 2 0 1,看看1和2的距离就知道了.需要注意的是数据记得开long long,不然计算步数是会溢出.
代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include <cstdio> 2 #include <cmath> 3 #include <iostream> 4 #include <cstring> 5 #include <algorithm> 6 #include <vector> 7 #include <string> 8 #include <utility> 9 #include <queue> 10 #include <stack> 11 #include <map> 12 #include <set> 13 const long long INF=0x3f3f3f3f3f3f3f3f; 14 using namespace std; 15 16 long long gcd(long long a,long long b) 17 { 18 return b?gcd(b,a%b):a; 19 } 20 21 int main() 22 { 23 // freopen("in.txt","r",stdin); 24 // freopen("out.txt","w",stdout); 25 long long n,k,a,b; 26 cin>>n>>k>>a>>b; 27 long long minn=INF,maxn=0; 28 for(int i=0;i<n;i++) 29 { 30 long long l=i*k+a+b; 31 long long res=n*k/(gcd(n*k,l)); 32 minn=min(minn,res),maxn=max(maxn,res); 33 long long s=a-b; 34 if(s<0) s*=-1; 35 l=i*k+s; 36 res=n*k/(gcd(n*k,l)); 37 minn=min(minn,res),maxn=max(maxn,res); 38 } 39 cout<<minn<<' '<<maxn<<endl; 40 return 0; 41 }