题解 【CF381A】 Sereja and Dima

本题是很好的双指针练习题。

关于双指针,详见洛谷日报#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 }
原文地址:https://www.cnblogs.com/xsl19/p/10438509.html