SDUT3524 友谊的小船

题目链接:http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=3524&cid=1741

第一次写博客,在校集训队可能算是比较晚的了,但是已经下定决心要做好ACM(受到了很大的刺激。。),就先拿这道前几天机试的水题写一下吧!

题目描述算是比较啰嗦的了,简单来说就是给定n个整数(A1,A2,..An),从第一个数(假设下标为i)开始往后选择第i*2或第i*2+1个数(如果存在的话),直到i*2>n并且i*2+1>n停止,然后计算可能得到的累加和中的最小的正整数。

算是裸的dfs了吧,当时比赛的时候这道题居然没有几个人过233,啰嗦的题面瞬间吓退了很多人,然而我也是被前面的几道不明题意的大水题给困住导致后边这几道能做出来的没做完,也有一点时间的因素吧,平时比赛都是3个小时,这次只有一个半,平时就做题马马虎虎改半天才A的我做成这样也不为奇了吧

废话不多说,直接上代码:

view plain copy print 如果您复制代码时出现行号,请点击左边的“view plain”后再复制
  1. #include <cstdio>  
  2. #include <cstring>  
  3. #include <algorithm>  
  4. using namespace std;  
  5. int m, n, a[1000005];  
  6. void dfs(int x, int ans)//ans记录x对应的和,这里最好是别用全局变量
  7. {  
  8.     if(x*2>n&&x*2+1>n&&ans>0&&ans<m)  //x*2>n&&x*2+1>n时更新m
  9.         m=ans;  
  10.     if(x*2<=n)  
  11.         dfs(2*x,ans+a[x*2]);  
  12.     if(x*2+1<=n)  
  13.         dfs(2*x+1,ans+a[x*2+1]);  
  14.     return ;  
  15. }  
  16. int main()  
  17. {  
  18.     while(~scanf("%d", &n))  
  19.     {  
  20.         m=99999999;  
  21.         for(int i=1;i<=n;i++)  
  22.             scanf("%d", &a[i]);  
  23.         dfs(1,a[1]);  
  24.         if(m!=99999999)  
  25.            printf("%d\n", m);  
  26.         else printf("Excuse me?\n");  //m==99999999表明最小值不为正整数
  27.     }  
  28.     return 0;  
  29. }  

你可能感兴趣的:(SDUT3524 友谊的小船)