感觉今天状态不太好啊一大早就很困,t1卡得有点久,以为三道题都是这个难度,结果难度完全是倒着排的啊!!在dp和数学上还得多练题!!

很像背包的一道DP??先不考虑树的结构,给每个点都先分配一个度数,剩下n-2个度数DP分配,dp[i]表示分配i个点出去可以获得的最大价值,由dp[1]~dp[i-1]转移过来(相当于在所有状态中选择最佳)。可以保证只要剩下n-2个度数分配出去就一定可以成立。

DP有关的题码量真是很少啊...

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std; int n, a[];
ll dp[]; int main ( ) {
freopen ( "a.in", "r", stdin );
freopen ( "a.out", "w", stdout );
int T;
scanf ( "%d", &T );
while ( T -- ) {
memset ( dp, , sizeof ( dp ) );
scanf ( "%d", &n );
for ( int i = ; i < n; i ++ )
scanf ( "%d", &a[i] );
dp[] = a[] * n;
for ( int i = ; i <= n-; i ++ )
for ( int j = ; j < i; j ++ )
dp[i] = max ( dp[i], dp[j] - a[] + a[i-j+] );
printf ( "%I64d\n", dp[n-] );
}
return ;
}

稍微一推就可以发现,k=k/i*i+k%i(p为余数,k/i向下取整),所以k%i=k-k/i*i,因此可以把所有k/i向下取整相同的i分到一组,i在这段中又可以用等差数列算出来。也能够证明枚举的k/i不超过sqrt(k)个,时间复杂度大大减少。

数学类的想通了码量什么的???

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std; ll n, k; int main ( ) {
freopen ( "b.in", "r", stdin );
freopen ( "b.out", "w", stdout );
scanf ( "%I64d%I64d", &n, &k );
ll ki = ;
ll ans = n * k;
while ( ki <= min ( n, k ) ) {
ll a = k / ki;
ll b = min ( k / a, n );
ans -= a * ( ki + b ) * ( b - ki + ) / ;
ki = b + ;
}
printf ( "%I64d", ans );
return ;
}

今天真正的水题!一眼就能看出二分答案啊!主要是check函数里面要注意,等差数列如果小的值到0了要把之后的全都变成1再判断。

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std; ll n, m, k; bool check ( ll an ) {
ll t1 = , t2 = ;
if ( an >= k ) t1 = ( an - k + + an - ) * ( k - ) / ;
else {
t1 = ( an - ) * an / ;
t1 += ( k - an );
}
if ( n - k + <= an ) t2 = ( an - n + k + an ) * ( n - k + ) / ;
else {
t2 = ( an ) * ( an + ) / ;
t2 += n - ( k + an - );
}
if ( t1 + t2 <= m ) return ;
return ;
} ll erfen ( ) {
ll l = , r = m, res = ;
while ( l <= r ) {
int mid = ( l + r ) >> ;
if ( check ( mid ) ) {
l = mid + ; res = mid;
} else r = mid - ;
}
return res;
} int main ( ) {
freopen ( "c.in", "r", stdin );
freopen ( "c.out", "w", stdout );
int T;
scanf ( "%d", &T );
while ( T -- ) {
ll ans = ;
scanf ( "%I64d%I64d%I64d", &n, &m, &k );
if ( n == m ) {
printf ( "1\n" ); continue;
}
ans = erfen ( );
printf ( "%I64d\n", ans );
}
return ;
}

【8.13校内测试】【DP】【按除数分类】【二分】的更多相关文章

  1. 【8.31校内测试】【找规律二分】【DP】【背包+spfa】

    打表出奇迹!表打出来发现了神奇的规律: 1 1 2 2 3 4 4 4 5 6 6 7 8 8 8 8 9 10 10 11 12 12 12 13 14 14 15 16 16 16 16 16.. ...

  2. 【8.30校内测试】【找规律模拟】【DP】【二分+贪心】

    对于和规律或者数学有关的题真的束手无策啊QAQ 首先发现两个性质: 1.不管中间怎么碰撞,所有蚂蚁的相对位置不会改变,即后面的蚂蚁不会超过前面的蚂蚁或者落后更后面的蚂蚁. 2.因为所有蚂蚁速度一样,不 ...

  3. 【11.5校内测试】【倒计时5天】【DP】【二分+贪心check】【推式子化简+线段树】

    Solution 非常巧妙的建立DP方程. 据dalao们说题目明显暗示根号复杂度??(反正我是没看出来 因为每次分的块大小一定不超过$\sqrt n$,要不然直接每个位置开一个块答案都才为$n$. ...

  4. 《Clojure编程》笔记 第13章 测试

    目录 背景简述 第13章 测试 13.1 术语 13.2 clojure.test 13.2.1 定义测试的两种方式 13.2.1.1 用deftest宏把测试定义成单独的函数 13.2.1.2 用w ...

  5. 【10.3校内测试【国庆七天乐!】】【DP+组合数学/容斥】【spfa多起点多终点+二进制分类】

    最开始想的暴力DP是把天数作为一个维度所以怎么都没有办法优化,矩阵快速幂也是$O(n^3)$会爆炸. 但是没有想到另一个转移方程:定义$f[i][j]$表示每天都有值的$i$天,共消费出总值$j$的方 ...

  6. 【10.31校内测试】【组合数学】【记忆化搜索/DP】【多起点多终点二进制拆位Spfa】

    Solution 注意取模!!! Code #include<bits/stdc++.h> #define mod 1000000007 #define LL long long usin ...

  7. 【10.17校内测试】【二进制数位DP】【博弈论/预处理】【玄学(?)DP】

    Solution 几乎是秒想到的水题叻! 异或很容易想到每一位单独做贡献,所以我们需要统计的是区间内每一位上做的贡献,就是统计区间内每一位是1的数的数量. 所以就写数位dp辣!(昨天才做了数字统计不要 ...

  8. 【11.8校内测试】【倒计时2天】【状压DP】【随机化?/暴力小模拟】

    Solution 数据范围疯狂暗示状压,可是一开始发现状态特别难受. 将每一层的奇偶性状压,预处理所有状态的奇偶性.每一层的输入代表的其实可以是下一层某个点可以被从这一层哪些点转移到. 所以枚举每个状 ...

  9. 【10.29校内测试】【线段树】【DP】【二进制Trie树求最小值最大】

    Solution 标程太暴力惹QAQ 相当于是26棵线段树的说QAQ 不过我写了另一种写法,从大到小枚举每一个字母,标记字典序在这个字母之上的位置为1,每次都建一棵线段树,维护1的数量,即区间和. 修 ...

随机推荐

  1. zookeeper集群查看状态时报错Error contacting service. It is probably not running的一些坑以及解决办法

    最近在搭建mq集群时候需要用到,zookeeper,可是启动的时候显示成功了,查看状态的时候却报错了: 碰到这个问题也是研究好好半天才解决,这里就总结出一个快速解决办法! 首先,必须看日志: 报错信息 ...

  2. 【黑客免杀攻防】读书笔记14 - 面向对象逆向-虚函数、MFC逆向

    虚函数存在是为了克服类型域解决方案的缺陷,以使程序员可以在基类里声明一些能够在各个派生类里重新定义的函数. 1 识别简单的虚函数 代码示例: #include "stdafx.h" ...

  3. 80.YCrCb - YUV - RGB之间的介绍

    一,引言 YUV(亦称YCrCb)是被欧洲电视系统所采用的一种颜色编码方法(属于PAL).YUV主要用于优化彩色视频信号的传输,使其向后兼容老式黑白电视.与RGB视频信号传输相比,它最大的优点在于只需 ...

  4. 浅谈mysql配置优化和sql语句优化【转】

    做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...

  5. SQL语句帮助大全

    --删除约束 Status:字段名 alter table Table_1 drop constraint Status; --添加约束 --Status :字段名 t_Pay_Order:表名 默认 ...

  6. 正则表达式基础->

    描述:(grep) 正则表达式是一种字符模式,用于在查找过程中匹配指定的字符.在大多数程序里,正则表达式都被置于两个正斜杠之间,它匹配被查找的行中任何位置出现的相同模式 基础正则表达式 正则表达式 描 ...

  7. Python的set集合详解

    Python 还包含了一个数据类型 -- set (集合).集合是一个无序不重复元素的集.基本功能包括关系测试和消除重复元素.集合对象还支持 union(联合),intersection(交),dif ...

  8. java基础55 UDP通讯协议和TCP通讯协议

    本文知识点(目录): 1.概述    2.UDP通讯协议    3.TCPP通讯协议 1.概述 1.在java中网络通讯作为Socket(插座)通讯,要求两台都必须安装socket.    2.不同的 ...

  9. CF1030A 【In Search of an Easy Problem】

    题目巨简单,主要是给大家翻译一下 给n个数,其中存在1就输出HARD,否则输出EASY,不区分大小写 #include<iostream> #include<cstdio> u ...

  10. 进程同步——哲学家进餐问题Java实现

    哲学家就餐问题是1965年由Dijkstra提出的一种线程同步的问题. 问题描述:一圆桌前坐着5位哲学家,两个人中间有一只筷子,桌子中央有面条.哲学家思考问题,当饿了的时候拿起左右两只筷子吃饭,必须拿 ...