本题是很好的双指针练习题。
关于双指针,详见洛谷日报#73。
我们可以用两个指针l和r表示题中两人接下来要比较的数字,用fl标记下一个将要取的人,并分别用两个计数器统计双方的答案。
因此,我们有了如下AC代码:
1 #include <bits/stdc++.h>//万能头文件 2 3 using namespace std;//使用标准名字空间 4 5 inline int read()//快速读入 6 { 7 int f=1,x=0; 8 char c=getchar(); 9 10 while(c<'0' || c>'9') 11 { 12 if(c=='-')f=-1; 13 c=getchar(); 14 } 15 16 while(c>='0' && c<='9') 17 { 18 x=x*10+c-'0'; 19 c=getchar(); 20 } 21 22 return f*x; 23 } 24 25 int n,a[1010]/*输入的数*/,ans[3]/*答案*/,l/*左指针*/,r/*右指针*/,fl/*标记*/; 26 27 int main() 28 { 29 n=read();//输入n 30 31 for(register int i=1; i<=n; i++) 32 { 33 a[i]=read();//输入每个数 34 } 35 36 l=1,r=n;//初始化指针 37 38 while(n--)//如果还有牌取 39 { 40 if(fl==0)//如果是第一个人取 41 { 42 if(a[l]<a[r])//如果右边的比左边的牌大 43 { 44 ans[1]=ans[1]+a[r];//累加 45 46 --r;//移动指针 47 } 48 else//如果右边的牌比左边的小(或者等于) 49 { 50 ans[1]=ans[1]+a[l];//累加 51 52 ++l;//移动指针 53 } 54 55 fl=1;//接下来是第二个人取 56 } 57 else//如果是第二个人取 58 { 59 //代码和第一个人取几乎一样,只是改了累加的计数器 60 if(a[l]<a[r]) 61 { 62 ans[2]=ans[2]+a[r]; 63 64 --r; 65 } 66 else 67 { 68 ans[2]=ans[2]+a[l]; 69 70 ++l; 71 } 72 73 fl=0;//接下来是第一个人取 74 } 75 } 76 77 printf("%d %d",ans[1],ans[2]);//输出,注意顺序! 78 79 return 0;//完美结束 80 }