zoukankan      html  css  js  c++  java
  • Codeforces 731D Funny Game

    Description

    Once upon a time Petya and Gena gathered after another programming competition and decided to play some game. As they consider most modern games to be boring, they always try to invent their own games. They have only stickers and markers, but that won't stop them. The game they came up with has the following rules. Initially, there are (n) stickers on the wall arranged in a row. Each sticker has some number written on it. Now they alternate turn, Petya moves first.
    One move happens as follows. Lets say there are (m le 2) stickers on the wall. The player, who makes the current move, picks some integer (k) from (2) to (m) and takes (k) leftmost stickers(removes them from the wall). After that he makes the new sticker, puts it to the left end of the row, and writes on it the new integer, equal to the sum of all stickers he took on this move. Game ends when there is only one sticker left on the wall. The score of the player is equal to the sum of integers written on all stickers he took during all his moves. The goal of each player is to maximize the difference between his score and the score of his opponent. Given the integer (n) and the initial sequence of stickers on the wall, define the result of the
    game, i.e. the difference between the Petya's and Gena's score if both players play optimally.

    Input

    The first line of input contains a single integer (n) (( 2 le n le 200 000 )) — the number of stickers,initially located on the wall.
    The second line contains (n) integers (a_1 , a_2 , dots , a_n) (( ­ 10 000 le a_i le10 000 )) — the numbers on stickers in order from left to right.

    Output

    Print one integer — the difference between the Petya's score and Gena's score at the end of the game if both players play optimally.

    Sample Input

    3
    2 4 8

    Sample Output

    4
    1 -7 -2 3

    比赛时想了个dp,过了pretest,但是fst了。算法的确有很大的bug(居然还能过pretest,还没人hack。。。)

    考虑最优解,它一定时(a_{i_{1}}-a_{i_{2}}+cdots+(-1)^{t-1}a_{i_{t}}+(i-1)^ta_n)

    但是我们无法确定直接确定(a_{i_1})的值,但是最后一个肯定是(a_n),所以我们可以从后边往前边推。由于两个人其实是等价的,对于已经确定好的一段后缀,很明显我们可以通过贪心的方法来使答案尽可能地优。设当前的([i+1,n])这段后缀的答案为(ans),我们枚举第(i)个,则有$$ans = max(ans,a_i+(-ans))$$

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    using namespace std;
    
    #define maxn (200010)
    #define inf (1<<30)
    int pre[maxn],N,mx;
    
    int main()
    {
    	freopen("E.in","r",stdin);
    	freopen("E.out","w",stdout);
    	scanf("%d",&N);
    	for (int i = 1;i <= N;++i) scanf("%d",pre+i),pre[i] += pre[i-1];
    	mx = pre[N];
    	for (int i = N-1;i > 1;--i) mx = max(mx,pre[i]-mx);
    	printf("%d",mx);
    	fclose(stdin); fclose(stdout);
    	return 0;
    }
    
  • 相关阅读:
    使用 @Autowired 的时候,到底是写接口还是实现类?
    socket的简单例子
    java 将文件夹所有的文件合并到指定的文件夹下
    java 复制某一文件夹下的所有文件到另一个文件夹下
    java Date日期总结的一些转换的方法
    java 可排序的数值得字符串,转化成list集合后进行的排序的几种方法
    java 查看文件的大小的方法
    java 从一个总的list集合中,去掉指定的集合元素,得到新的集合
    java 可拆成数组的字符串,去掉重复元素的一种方法
    将博客搬至CSDN
  • 原文地址:https://www.cnblogs.com/mmlz/p/6021416.html
Copyright © 2011-2022 走看看