dp cf 1700 最近几天的刷题
这个题目的意思是,把这个n的序列分成三个连续的部分,要求这三个部分的和是一样的。问这种划分的方法有多少种。
这个题目和之前写过的数字划分有点像,这个就是要先进行前缀和的处理,然后找到s/3 和 2*s/3 这两个位置。
因为这个有负数,所以有可能出现,2*s/3 的位置在 s/3 的位置之后,所以这个时候就需要进行处理。
我们每一个 s/3 去找到 2*s/3 的所有合法位置即可。
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 5e5 + ;
ll a[maxn], sum[maxn];
int x[maxn], y[maxn]; int main()
{
int n;
ll S = ;
scanf("%d", &n);
for(int i=;i<=n;i++)
{
scanf("%lld", &a[i]);
sum[i] = sum[i - ] + a[i];
S += a[i];
}
if (S % != ) {
printf("0\n");
return ;
}
S /= ;
int tot = , cnt = ;
for(int i=;i<n;i++)
{
if (sum[i] == S) x[tot++] = i;
if (sum[i] == * S) y[cnt++] = i;
}
if(tot==||cnt==)
{
printf("0\n");
return ;
}
ll ans = ;
for(int i=;i<tot;i++)
{
ll len = upper_bound(y, y + cnt, x[i]) - y;
ans += (cnt - len);
}
printf("%lld\n", ans);
return ;
}
C
这个题目是一个很简单的线性dp。
题目大意:土拨鼠吃花,对于白花,它只吃数量恰好为k这么多的白花,不然就不吃,它给你一个区间从a到b,表示花的数量从a到b,求土拨鼠吃花的方案数。
这个和之前寒假回来后的选拔赛的dp是一样的,因为这个和顺序也有关,所以要先枚举背包容量,然后再去枚举种类,如果和放入背包的顺序无关,就是先枚举种类再去枚举数量。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#define inf 0x3f3ff3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 1e5 + ;
const ll mod = 1e9 + ;
ll dp[maxn];
ll sum[maxn]; int main()
{
int t, k;
scanf("%d%d", &t, &k);
dp[] = ;
for (int i = ; i <= maxn; i++) {
if (i >= k) {
dp[i] = dp[i - ] + dp[i - k];
dp[i] %= mod;
}
else {
dp[i] = dp[i - ];
dp[i] %= mod;
}
}
for(int i=;i<=maxn;i++)
{
sum[i] = sum[i - ] + dp[i];
sum[i] %= mod;
}
while(t--)
{
int a, b;
scanf("%d%d", &a, &b);
ll ans = (sum[b] - sum[a - ] + mod) % mod;
printf("%lld\n", ans);
}
return ;
}
D
题目大意:您的任务是找到a的最长子段,这样可以从子段中最多更改一个数字(将一个数字更改为您想要的任何整数),以使子段严格增加。
这个就是处理一下 对于第 i 个值,求出以 i 为起点的递增序列的长度,以 i 为终点的递增序列长度。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#define inf 0x3f3ff3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 1e5 + ;
ll a[maxn], dp1[maxn], dp2[maxn]; int main()
{
int n;
scanf("%d", &n);
a[] = -inf;
for (int i = ; i <= n; i++) {
scanf("%lld", &a[i]);
dp1[i] = ;
dp2[i] = ;
}
ll mx = ;
for (int i = ; i <= n; i++) {
if (a[i] > a[i - ]) dp1[i] = dp1[i - ] + ;
mx = max(dp1[i], mx);
}
for (int i = n - ; i >= ; i--) {
if (a[i] < a[i + ]) dp2[i] = dp2[i + ] + ;
//printf("dp2[%d]=%lld\n", i, dp2[i]);
}
ll ans = ;
for(int i=;i<=n;i++)
{
if (a[i - ] <= a[i + ] - ) ans = max(ans, dp1[i - ] + dp2[i + ] + );
}
if (mx < n) mx++;
ans = max(ans, mx);
printf("%lld\n", ans);
return ;
}
A
这个题目我觉得有点难,就是找到一个长度恰好为m的k个区间,然后这k个区间求和,使得和最大。
这个n,m,k都比较小,所以可以定义一个二维的,这个和之前的奶牛的题目有点类似https://www.cnblogs.com/EchoZQN/p/11043552.html
这个是lj给了我这个dp状态的定义,我才写出来转移方程的
dp[i][j] 表示前面 i 个数,选了j个区间的最大和。
所以这个转移方程就是 如果我们选了第i个数 那么 dp[i][j]=max(dp[i-m][j-1],dp[i][j])
如果我们不选第 i 个数 那么 dp[i][j]=max(dp[i][j],dp[i-1][j])
这个都写出来了,就很好写了。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#define inf 0x3f3ff3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 1e5 + ;
ll sum[maxn], a[maxn], dp[][]; int main()
{
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
for (int i = ; i <= n; i++) {
scanf("%lld", &a[i]);
sum[i] = sum[i - ] + a[i];
}
for(int i=;i<=n;i++)
{
for(int j=;j<=k;j++)
{
if (i >= m) {
dp[i][j] = max(dp[i - m][j - ] + sum[i] - sum[i - m], dp[i][j]);
dp[i][j] = max(dp[i - ][j], dp[i][j]);
}
else dp[i][j] = dp[i - ][j];
}
}
printf("%lld\n", dp[n][k]);
return ;
}
C
这个题目不是很难,但是需要想一想。
首先,我们优先考虑这个数的长度,然后再考虑这个数的大小。
所以我们可以先由这个最小的数求出长度,然后再去找这个长度如果不整除,那就尽量选更大的。
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 1e6 + ;
int b[maxn];
int a[]; int main()
{
int V;
scanf("%d", &V);
int mn = inf;
for (int i = ; i <= ; i++) {
scanf("%d", &a[i]);
mn = min(mn, a[i]);
}
if (V < mn) {
printf("-1\n");
return ;
}
//printf("mn=%d\n", mn);
int tot = ;
int len = V / mn;
int M = V % mn;
int mx = mn + M;
while(len--)
{
//printf("len=%d mx=%d\n", len, mx);
int flag = ;
for(int i=;i>=;i--)
{
if(a[i]<=mx)
{
flag = i;
b[tot++] = i;
break;
}
}
mx -= (a[flag] - mn);
}
for (int i = ; i < tot; i++) printf("%d", b[i]);
printf("\n");
return ;
}
B
dp cf 1700 最近几天的刷题的更多相关文章
- $2019$ 暑期刷题记录1:(算法竞赛DP练习)
$ 2019 $ 暑期刷题记录: $ POJ~1952~~BUY~LOW, BUY~LOWER: $ (复杂度优化) 题目大意:统计可重序列中最长上升子序列的方案数. 题目很直接的说明了所求为 $ L ...
- DP刷题记录(持续更新)
DP刷题记录 (本文例题目前大多数都选自算法竞赛进阶指南) TYVJ1071 求两个序列的最长公共上升子序列 设\(f_{i,j}\)表示a中的\(1-i\)与b中色\(1-j\)匹配时所能构成的以\ ...
- DP刷题记录
目录 dp刷题记录 codeforces 706C codeforces 940E BZOJ3997 POJ2279 GYM102082B GYM102082D codeforces132C L3-0 ...
- 湾区求职分享:三个月刷题拿到 Google offer,欢迎踊跃提问
本文仅以个人经历和个人观点作为参考.如能受益,不胜荣幸. 本文会不断的修正,更新.希望通过大家的互动最后能写出一份阅者受益的文章. 本文纯手打,会有错别字,欢迎指出,虚心接受及时更改. 小马过河,大牛 ...
- XidianOJ 1020 ACMer去刷题吧
题目描述 刷题是每个ACMer必由之路,已知某oj上有n个题目,第i个题目小X能做对的概率为Pi(0<=Pi<=1,1<=i<=n) 求小X至少做对k道题的概率 输入 第一行输 ...
- NOI题库刷题日志 (贪心篇题解)
这段时间在NOI题库上刷了刷题,来写点心得和题解 一.寻找平面上的极大点 2704:寻找平面上的极大点 总时间限制: 1000ms 内存限制: 65536kB 描述 在一个平面上,如果有两个点( ...
- 一次失败的刷题经历:[LeetCode]292之尼姆游戏(Nim Game)(转)
最近闲来无事刷LeetCode,发现这道题的Accept Rate还是挺高的,尝试着做了一下,结果悲剧了,把过程写下来,希望能长点记性.该题的描述翻译成中文如下: 你正在和你的朋友玩尼姆游戏(Nim ...
- 【刷题记录】BZOJ-USACO
接下来要滚去bzoj刷usaco的题目辣=v=在博客记录一下刷题情况,以及存一存代码咯.加油! 1.[bzoj1597][Usaco2008 Mar]土地购买 #include<cstdio&g ...
- POJ 水题(刷题)进阶
转载请注明出处:優YoU http://blog.csdn.net/lyy289065406/article/details/6642573 部分解题报告添加新内容,除了原有的"大致题意&q ...
随机推荐
- 伪类选择器 :nth-child(even) :nth-child(odd) :nth-of-type
属性 描述 CSS :active 向被激活的元素添加样式. 1 :focus 向拥有键盘输入焦点的元素添加样式. 2 :hover 当鼠标悬浮在元素上方时,向元素添加样式. 1 :link 向未被访 ...
- pandas基础(3)_数据处理
1:删除重复数据 使用duplicate()函数检测重复的行,返回元素为bool类型的Series对象,每个元素对应一行,如果该行不是第一次出现,则元素为true >>> df =D ...
- Fenwick Tree / Binary Indexed Tree
Motivation: Given a 1D array of n elements. [2, 5, -1, 3, 6] range sum query: what's the sum from 2n ...
- c# 库间关系
- Hyperledger Fabric (1.0)环境部署 chaincode【转】
三.测试Fabric 其实我们在前面运行./network_setup.sh up的时候系统已经运行了一个Example02的ChainCode测试,部署上去的ChainCodeName是mycc,所 ...
- 洛谷P3688/uoj#291. [ZJOI2017]树状数组
传送门(uoj) 传送门(洛谷) 这里是题解以及我的卡常数历程 话说后面那几组数据莫不是lxl出的这么毒 首先不难发现这个东西把查询前缀和变成了查询后缀和,结果就是查了\([l-1,r-1]\)的区间 ...
- ASPNET Core 2.x中的Kestrel服务器
原文链接 Kestrel是一个基于libuv的跨平台ASP.NET Core web服务器,libuv是一个跨平台的异步I/O库.ASP.NET Core模板项目使用Kestrel作为默认的web服务 ...
- PAT甲级——1114 Family Property (并查集)
此文章同步发布在我的CSDN上https://blog.csdn.net/weixin_44385565/article/details/89930332 1114 Family Property ( ...
- Beanshell vs JSR223 vs Java JMeter脚本:性能关闭你一直在等待!
有几个选项可用于执行自定义JMeter脚本并扩展基线JMeter功能.查看最流行的扩展机制,比较性能并分析哪一个是最好的. 这是乐队之战,JMeter风格. Beanshell V. JSR223 V ...
- urllib2基础操作
Urllib2基础操作 1.打开网页(urlopen) 打开一个网页 import urllib2 response = urllib2.urlopen('http://www.baidu.com') ...