B - Magical Subsequence (CCPC2021哈尔滨)

2023-10-25 09:28

本文主要是介绍B - Magical Subsequence (CCPC2021哈尔滨),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

思路:

(1)问题:对于已知数组,每组依次选两个,尽量选更多组,选的每组和相等;(假定和为x)

(2)于是问题拆分为两步,

  1. x是多少
  2. x确定时,怎样选更多组

(3)对于问题1,注意到A:(1,100),所以x:(2,200)枚举即可;

对于问题2,x确定条件下,显然能选则选最多,此时有两条思路,

  1. 前面拿到值从后面找(复杂度O(n^2)且不能保证尽可能长)
  2. 后面拿到值往前面找,(开st[]数组查询,此时充分利用前面信息,复杂度O(n+100),且尽可能靠前进行查找;

(4)于是选择思路2,(注意使用set会超时,数组小时应尽量用数组,因为查询复杂度小)

代码:

#include<bits/stdc++.h>using namespace std;typedef long long LL;const int N = 1e5 + 10;LL a[N];
LL st[210];
int main()
{int n;cin >> n;for(int i = 0;i < n;i ++)scanf("%d",&a[i]);LL maxn = 0;for(int i = 2;i <= 200;i ++){memset(st,0,sizeof st);LL tmp = 0;for(int j = 0;j < n;j ++){if(st[i - a[j]] == 1){tmp += 2;maxn = max(maxn,tmp);memset(st,0,sizeof st);}else st[a[j]] = 1;}}cout << maxn<< endl;return 0;
}

这篇关于B - Magical Subsequence (CCPC2021哈尔滨)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/281604

相关文章

[LeetCode] 300. Longest Increasing Subsequence

题:https://leetcode.com/problems/longest-increasing-subsequence/description/ 题目 Given an unsorted array of integers, find the length of longest increasing subsequence. Example: Input: [10,9,2,5,3,7

[LeetCode] 594. Longest Harmonious Subsequence

题:https://leetcode.com/problems/longest-harmonious-subsequence/description/ 题目 We define a harmonious array is an array where the difference between its maximum value and its minimum value is exactl

【HDU】4991 Ordered Subsequence 线段树树状数组

传送门:【HDU】4991 Ordered Subsequence 题目分析:本题就是求长度为m的严格上升序列的个数。 就是个DP! 设dp[ i ][ j ]为以位置i的数为结尾的长度为j的严格上升序列的个数。 则dp[ i ][ j ] = sum { dp[ k ][ j - 1 ] | 1 <= k <= i - 1 } 那么如果朴素O(n^2)不超时是不用想了,这样我们该

浙大数据结构:01-复杂度2 Maximum Subsequence Sum

数据结构MOOC PTA习题 01-复杂度2 Maximum Subsequence Sum #include <iostream>using namespace std;const int M = 100005;int a[M];int main(){int k;cin >> k;int f = 1;for (int i = 0; i < k; i++){cin >> a[i

Palindromic Subsequence(最长回文字符串 输出路径)

初看好简单   一开始调试着一直re   后来也不知道怎么就对了  但是还有一些bug存在   , 这道题的打印路径和light oj An Easy LCS(ps:点击打开链接)一样 但是只改一下会Tle  因为(1000*1000*1000)好大 但是把存储的字符串改为string 定义的就过了 但是还是有一点有点难受(下面会说出) 我也是醉了 #include <stdio.

HDU 3530 Subsequence

这个题意是给你n个数,然后寻找一个区间,区间的最大值与最小值的差要小于k并且大于m 思路: 用两个单调序列维护这个序列,显而易见用当前者两个单调序列的列首相减如果大于k的话那么,我们就要寻找列首在序列位置比较小的那个往后面加1。这个题目的难点在于题目意思是区间,我理解错了。以为是那种最长公共子序列那种。 #include <cstdio>#include <cstring>#incl

ZJU2136 Longest Ordered Subsequence

这是一道经典的最长上升子序列问题,首先确定阶段和状态。然而每个阶段仅仅有一个状态,使用一位数组递推。 令 dp[i] 表示以 i 结尾的最长上升子序列的长度,则有 dp[i] = { max(dp[j]) + 1 | 0 <= j <i, seq[i] > seq[j] } 边界 dp[0] = 1 表示首个为结尾的最长串长度为1。 #define LOCAL#include <iost

Aizu 2541 Magical Bridges

题意: n个岛屿,由m条桥连接,其中有k条是魔法桥,你可以用魔法把他们变成相同长度。 求在执行魔法后,两个起点S1和S2到终点T的最短路的最小绝对差。 (1≤n≤1000,1≤m≤2000,1≤k≤100) (1\leq n\leq 1000,1\leq m\leq 2000,1\leq k\leq 100) S1 S_1和 S2 S_2到 T T的最短路将会是如 j×x+disj\t

LeetCode 446. Arithmetic Slices II - Subsequence

一道长得一副dp的样子的dp题。 这道题难度不算特别大,因为看得出来肯定是dp题。因为,一个等差序列里面有好几个小的等差序列。 例如,2 4是一个等差序列,2 4 6是一个等差序列。 所以我们发现等差序列是可以扩展的。 那么就得到了,咱们的转移方程的一部分 dp[i][delta]=dp[j][delta]+1 dp[i][delta] = dp[j][delta] + 1

376. Wiggle Subsequence dp+贪心

http://blog.csdn.net/qq508618087/article/details/51991068 贪心算法: 最大是len 从前往后,每有一位不符合条件则 res-- 不符条件的情况就是连续加或者连续减  如果出现这种情况那么在连续加的最后一位一定是最大值,连续减的最后一位一定是最小值 这样一定会保证有最好的情况 public class Soluti