题目链接:http://acm.timus.ru/problem.aspx?space=1&num=2000
input | output |
---|---|
10 1 2 3 4 5 6 7 8 9 0 4 8 |
21 24 |
题意:
两个人从给出的两个点出发,每次只能向左或向右移一步!每个人所得分数就是移到的单元格的分数,然后把所在单元格的分数设置为零!
求两个人分别能得到的最大分数!
PS:
贪心原则!最开始一定是先向对方所在的位置移动!移动到两个人初始位置距离的一半的时候在往回走! 这样对方永远不可能追上你!
代码如下:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int main() { int n; int a[100047]; while(~scanf("%d",&n)) { int sum = 0; for(int i = 1; i <= n; i++) { scanf("%d",&a[i]); sum += a[i]; } int p1, p2; scanf("%d%d",&p1,&p2); int sum1 = 0, sum2 = 0; int ans = 0; if(p1 > p2) { int tt = (p1-p2)/2; // for(int i = 1; i <= p2+tt; i++) // { // sum2 += a[i]; // } for(int i = p1-tt; i <= n; i++) { sum1 += a[i]; } ans = sum1; // ans = max(sum1, sum2); } else if(p1 == p2) { for(int i = 1; i <= p1; i++) { sum1 += a[i]; } for(int i = p2; i <= n; i++) { sum2 += a[i]; } ans = max(sum1, sum2); } else if(p1 < p2) { int tt = (p2-p1)/2; for(int i = 1; i <= p1+tt; i++) { sum1 += a[i]; } // for(int i = p2-tt+1; i <= n; i++) // { // sum2 += a[i]; // } // ans = max(sum1, sum2); ans = sum1; } printf("%d %d\n",ans,sum-ans); } return 0; } /* 5 1 2 3 4 5 2 3 5 1 2 3 4 5 2 4 */
URAL 2000. Grand Theft Array V(贪心啊)
原文地址:http://blog.csdn.net/u012860063/article/details/43738225