击鼓传花:(C++)

击鼓传花
内存限制: 256 Mb时间限制: 1000 ms
题目描述
小爱和小艾在玩一个游戏。游戏一共有 nn 轮,第 ii 轮有一个分数 a_ia
i

,在每一轮里,手上有花的人可以做出选择:

他可以选择保留花,这样,这一轮的分数就会送给对方;
他可以选择保留分数,这样,花就会送给对方;
游戏一开始,花在小爱手里,若假设双方均会使用最佳策略去得分,那么输出小爱的最后得分是多少?

输入格式
第一行:一个正整数 nn
第二行:nn 个正整数 a_ia
i

输出格式
单个正整数:表示小爱获得的分数

数据范围
对于 30%30% 的数据,保证 1\leq n\leq 501≤n≤50;
对于 60%60% 的数据,保证 1\leq n\leq 50001≤n≤5000;
对于 100%100% 的数据,保证 1\leq n\leq 200,0001≤n≤200,000;
1 \leq a_i \leq 100001≤a
i ≤10000;
样例数据
输入:
4
5 2 7 3

输出:
10

你可以看看https://blog.csdn.net/snyyjiao/article/details/48980643


#include<iostream>
#include<cstdlib>
using namespace std;
typedef struct Node{
    int number;
    struct Node* next;
}LNode;
int main()
{
    int n;
    cin >> n;
    LNode *head, *p, *pre = NULL;
    p = head = new LNode;
    for (int i = 1; i < n; i++) {
        p->number = i;
        p->next = new LNode;
        p = p->next;
    }
    p->number = n;
    p->next = head;//形成循环链表 
    //开始击鼓传花 
    p = head;
    int count = 1;//计数 
    while (p->next != p) {
        if (count%3 == 0) {
            //出链表 
            pre->next = p->next;
            free(p);
            p = pre;
        }
        count++;
        pre = p;
        p = p->next;
    }
    cout << p->number << endl;
    return 0;
}

https://www.noobdream.com/post/1025/
这是这个博主的源码,你可以看一看

看看可以不

img


#include <iostream>
using namespace std;
int t[200000];

int main()
{
    int n,j,score1=0,score2=0,pinj,sum=0,flg=0;
    cin>>n;
    for(j=0; j<n; j++)
    {
        cin>>t[j];
        sum+=t[j];
    }
    pinj=sum/n;
    for(j=0; j<n; j++)
    {
        if(flg==0)
        {
            if(t[j]>=pinj||j==n-1)
            {
                score1+=t[j];
                flg=1;
            }
            else
            {
                score2+=t[j];
            }
        }
        else
        {
            if(t[j]>=pinj||j==n-1)
            {
                score2+=t[j];
                flg=0;
            }
            else
            {
                score1+=t[j];
            }
        }
    }
    cout <<score1;
    return 0;
}