Educational Codeforces Round 19 B. Odd sum(贪心或dp)

题意:给出一组数,从中拿出几个,要让它们之和最大并且为奇数。

这道题给出的n不大,贪心暴力一下就可以了。(-?-;)

1.贪心

我是先把数据大于0并且为偶数的数都先加起来(保证开始的sum是偶数),数据大于0且为奇数的存在a数组里,数据小于0的存在b数组里。

然后如果有a数组有奇数个,直接加起来输出就好了。奇*奇=奇

偶数个的话就从sum中拿出a1,b1。特判一下a1(a数组里面最小的那个)和b1(b数组里最大的那个)哪个的绝对值大。

a1<b1 直接输出之前的sum,a1>=b1则输出sum+a1+b1。

注:有可能a数组或b数组里没有数储存,这个要特殊考虑一下。

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4
 5 const int maxn=111111;
 6 int a[maxn],b[maxn];
 7
 8 int main(){
 9     int n,temp,tot1=0,tot2=0;
10     long long sum=0;
11     cin>>n;
12
13     for(int i=1;i<=n;i++){
14         cin>>temp;
15         if(temp>=0){
16             if(temp%2==0) sum+=temp;
17             else a[tot1++]=temp;
18         }
19         else b[tot2++]=temp;
20     }
21
22     sort(b,b+tot2);
23     sort(a,a+tot1);
24
25     if(tot1%2==1){
26         for(int i=0;i<tot1;i++) sum+=a[i];
27         cout<<sum<<endl; return 0;
28     }
29
30     else{
31         for(int i=1;i<tot1;i++) sum+=a[i];
32         for(int i=tot2-1;i>=0;i--){
33             if(b[i]%2!=0){
34                 if(abs(b[i])>=a[0]&&a[0]!=0){cout<<sum<<endl; return 0;}
35                 else {cout<<sum+a[0]+b[i]<<endl; return 0;}
36             }
37         }
38     }
39
40     cout<<sum<<endl;
41     return 0;
42 }

2.dp

看了很久大神的dp做法,还是没看懂,(╯^╰)。自己太菜了,dp继续学习中。)逃

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4
 5 const int arr=1e5+10;
 6 int dp[arr][2];
 7 int a[arr];
 8
 9 void maximize(int &a,int b){
10     if(a<b) a=b;
11 }
12
13 int main(){
14     fill(dp[0],dp[0]+arr*2,-1e15);
15     dp[0][0]=0;
16     int n;
17     cin>>n;
18     for(int i=1;i<=n;i++) cin>>a[i];
19     for(int i=0;i<n;i++){
20         for(int j=0;j<2;j++){
21             maximize(dp[i+1][j],dp[i][j]);
22             maximize(dp[i+1][(j+a[i+1])%2],dp[i][j]+a[i+1]);
23         }
24     }
25     cout<<dp[n][1]<<endl;
26     return 0;
27 }
时间: 2024-10-12 16:36:15

Educational Codeforces Round 19 B. Odd sum(贪心或dp)的相关文章

Educational Codeforces Round 19

由于时间原因只A掉了前三题. Problem#A k-Factorization 题目传送门[here] 题目大意是说给出一个数n,能不能把它分成k个严格大于1的整数的乘积,如果可以,随便输出一种方案,否则就输出-1. 首先对n进行质因数分解,如果质因数的个数小于k就输出-1,否则随便合并几个使总数为k,然后输出就好了. Code 1 /** 2 * CodeForces 3 * Problem#797A 4 * Accepted 5 * Time:15ms 6 * Memory:2044k 7

Educational Codeforces Round 25 D - Suitable Replacement(贪心)

题目大意:给你字符串s,和t,字符串s中的'?'可以用字符串t中的字符代替,要求使得最后得到的字符串s(可以将s中的字符位置两两交换,任意位置任意次数)中含有的子串t最多. 解题思路: 因为知道s中的字符位置可以交换无数次,所以只要s中含有可以组成t的字符就一定可以出现子串t.所以就是要令t中的字符数量尽量平均地分布在s中. 代码: 1 #include<iostream> 2 #include<string> 3 using namespace std; 4 int str[30

Educational Codeforces Round 7 F - The Sum of the k-th Powers 拉格朗日插值

The Sum of the k-th Powers There are well-known formulas: , , . Also mathematicians found similar formulas for higher degrees. Find the value of the sum modulo 109 + 7 (so you should find the remainder after dividing the answer by the value 109 + 7).

【Educational Codeforces Round 37】F. SUM and REPLACE 线段树+线性筛

题意 给定序列$a_n$,每次将$[L,R]$区间内的数$a_i$替换为$d(a_i)$,或者询问区间和 这题和区间开方有相同的操作 对于$a_i \in (1,10^6)$,$10$次$d(a_i)$以内肯定可以最终化为$1$或者$2$,所以线段树记录区间最大值和区间和,$Max\le2$就返回,单点暴力更新,最后线性筛预处理出$d$ 时间复杂度$O(m\log n)$ 代码 #include <bits/stdc++.h> using namespace std; typedef long

Educational Codeforces Round 23 F. MEX Queries(线段树)

题目链接:Educational Codeforces Round 23 F. MEX Queries 题意: 一共有n个操作. 1.  将[l,r]区间的数标记为1. 2.  将[l,r]区间的数标记为0. 3.  将[l,r]区间取反. 对每个操作,输出标记为0的最小正整数. 题解: hash后,用线段树xjb标记一下就行了. 1 #include<bits/stdc++.h> 2 #define ls l,m,rt<<1 3 #define rs m+1,r,rt<&l

Educational Codeforces Round 22 E. Army Creation(主席树)

题目链接:Educational Codeforces Round 22 E. Army Creation 题意: 给你n个数和一个数k,然后有q个询问. 每个询问 有一个区间[l,r],问你这个区间内在满足每一种数不超过k的情况下,最大能选多少个数出来. 强制在线. 题解: 一看就要用到主席树,和主席数求区间内有多少不同的数的个数处理方法相同. 依次将每个数插入,当这个数出现的个数等于k了,就把最前面的那个数删掉. 然后询问就访问root[r]就行了. 第一次写完数据结构没有调试一遍过样例,一

Educational Codeforces Round 21 D. Array Division

题目链接:Educational Codeforces Round 21 D. Array Division 题意: 给你n个数,现在你可以改变1<=个数的位置,然后问你是否存在有一个k,使得sum(a[i])(1<=i<=k)==sum(a[j])(k+1<=j<=n) 题解: 分析: 如果需要将一个数移动,无非就是将这个数从第一部分移到第二部分,或者从第二部分移到第一部分. 所以,我们只需要开两个map来记录一下两部分有哪些数. 当两部分的差值/2等于其中一部分的一个数时

Educational Codeforces Round 21 F. Card Game(网络流之最大点权独立集)

题目链接:Educational Codeforces Round 21 F. Card Game 题意: 有n个卡片,每个卡片有三个值:p,c,l; 现在让你找一个最小的L,使得满足选出来的卡片l<=L,并且所有卡片的p的和不小于k. 选择卡片时有限制,任意两张卡片的c之和不能为质数. 题解: 和hdu 1565 方格取数(2)一样,都是求最大点权独立集. 不难看出来,这题再多一个二分. 注意的是在构造二部图的时候,按照c值的奇偶性构造. 当c==1时要单独处理,因为如果有多个c==1的卡片,

Educational Codeforces Round 71 (Rated for Div. 2) A - There Are Two Types Of Burgers

原文链接:https://www.cnblogs.com/xwl3109377858/p/11404050.html Educational Codeforces Round 71 (Rated for Div. 2) A - There Are Two Types Of Burgers There are two types of burgers in your restaurant — hamburgers and chicken burgers! To assemble a hamburg