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 ...
随机推荐
- HDU - 4804 Campus Design(状压+轮廓线dp)
Campus Design Nanjing University of Science and Technology is celebrating its 60th anniversary. In o ...
- Linux系统下使用split命令分割大文件 (转载)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://snailwarrior.blog.51cto.com/680306/140531 ...
- matplotlib画线(2)
这篇随笔是matplotlib画线的补充>>> #nocl参数控制图例中有几列,>>> import numpy as np>>> import ...
- Mac安装python细节
前言 之前在windows平台上安装python直接用Anaconda,优点是所有的科学计算的库都整合进去了,安装方便.在Mac系统下,当然也可以直接安装Anaconda,但是考虑到Mac会自带pyt ...
- unity 模型层次细节
http://blog.csdn.net/qq_25210959/article/details/51734517 层次细节(LOD),它是根据物体在游戏画面中所占视图的百分比来调用不同复杂度的模型的 ...
- 洛谷P2280 [HNOI2003]激光炸弹
P2280 [HNOI2003]激光炸弹 题目描述 输入输出格式 输入格式: 输入文件名为input.txt 输入文件的第一行为正整数n和正整数R,接下来的n行每行有3个正整数,分别表示 xi,yi ...
- uoj#279. 【UTR #2】题目交流通道(容斥+数数)
传送门 先考虑无解的情况,为以下几种:\(dis_{i,j}+dis_{j,k}<dis_{i,k}\),\(dis_{i,i}\neq 0\),\(dis_{i,j}\neq dis_{j,i ...
- 洛谷P1447 [NOI2010]能量采集(容斥)
传送门 很明显题目要求的东西可以写成$\sum_{i=1}^{n}\sum_{j=1}^m gcd(i,j)*2-1$(一点都不明显) 如果直接枚举肯定爆炸 那么我们设$f[i]$表示存在公因数$i$ ...
- SpringBoot2.0 基础案例(06):引入JdbcTemplate,和多数据源配置
一.JdbcTemplate对象 1.JdbcTemplate简介 在Spring Boot2.0框架下配置数据源和通过JdbcTemplate访问数据库的案例. SpringBoot对数据库的操作在 ...
- Invalid YGDirection 'vertical'. should be one of: ( inherit, ltr, rtl )
react native 路由( react-native-router-flux )跳转页面一直都报错 本项目解决方法:不是路由的问题,是跳转的页面有有问题,删除下图标记的红色即可(解决方法是排除法 ...