CF - 797B. Odd sum - 贪心

  1. 题目描述:
    B. Odd sum
    time limit per test
    1 second
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    You are given sequence a1, a2, ..., an of integer numbers of length n. Your task is to find such subsequence that its sum is odd and maximum among all such subsequences. It's guaranteed that given sequence contains subsequence with odd sum.

    Subsequence is a sequence that can be derived from another sequence by deleting some elements without changing the order of the remaining elements.

    You should write a program which finds sum of the best subsequence.

    Input

    The first line contains integer number n (1 ≤ n ≤ 105).

    The second line contains n integer numbers a1, a2, ..., an ( - 104 ≤ ai ≤ 104). The sequence contains at least one subsequence with odd sum.

    Output

    Print sum of resulting subseqeuence.

    Examples
    input
    4
    -2 2 -3 1
    
    output
    3
    
    input
    3
    2 -5 -3
    
    output
    -1
    
    Note

    In the first example sum of the second and the fourth elements is 3.

  2. 题意概述:给你n个数,要你它们子序列中求和为奇数的序列的最大值。
  3. 解题思路:如果数为偶数且大于0则肯定要选,奇数则讨论。对所有的奇数按最大值排序后求和,那么每加一个奇数就更新一下最大值。
  4. AC代码:
    #include <bits/stdc++.h>
    #define INF 0x3f3f3f3f
    #define maxn 100100
    #define lson root << 1
    #define rson root << 1 | 1
    #define lent (t[root].r - t[root].l + 1)
    #define lenl (t[lson].r - t[lson].l + 1)
    #define lenr (t[rson].r - t[rson].l + 1)
    #define N 1111
    #define eps 1e-6
    #define pi acos(-1.0)
    #define e exp(1.0)
    using namespace std;
    const int mod = 1e9 + 7;
    typedef long long ll;
    typedef unsigned long long ull;
    vector<int> odd;
    int main()
    {
    #ifndef ONLINE_JUDGE
    	freopen("in.txt", "r", stdin);
    	freopen("out.txt", "w", stdout);
    	long _begin_time = clock();
    #endif
    	int n;
    	while (~scanf("%d", &n))
    	{
    		odd.clear();
    		int ans = 0;
    		for (int i = 0; i < n; ++i)
    		{
    			int x;
    			scanf("%d", &x);
    			if (x & 1)
    				odd.push_back(x);
    			else if (x > 0)
    				ans += x;
    		}
    		sort(odd.begin(), odd.end(), greater<int>());
    		int sz = odd.size();
    		int sum = 0, res = -INF;
    		for (int i = 0; i < sz; i++)
    		{
    			sum += odd[i];
    			if (sum & 1)
    				res = max(res, sum + ans);
    		}
    		printf("%d\n", res);
    	}
    #ifndef ONLINE_JUDGE
    	long _end_time = clock();
    	printf("time = %ld ms.", _end_time - _begin_time);
    #endif
    	return 0;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值