题目链接: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