题意: 有个家伙装东西,他的策略是贪心,每次装进去这个盒子能装下的最大的东西,直到把这个盒子装满,再去装下一个盒子. 给出盒子的数量k和一些东西的重量,问你最小需要多大的盒子才能以这种贪心策略装下. 题解: 如果某个解可行,比它大的值未必可行,比如有15个物品,5个39,5个60,5个100,5个盒子,那么盒子大小199可以,200不行,201也不行.所以不能二分. 首先,显然答案下界为ceil(sum/k). 设最大的物品重量为maxv,假如某个ans装不下,那么在此ans下,装下除maxv外…
Upgrading Technology 题目传送门 解题思路 对于这题,我们可以枚举一个k从0~m,表示当前我们把所有技能最少升到了k级,且至少有一个为k级. 此时我们刚好获得了前k个d[]的收益,并花费了所有技能升到k级的花费.因为现在我们已经把所有技能都升到k了,为了获得当前情况下的最大收益,我们要把每一个技能继续升级到一定的等级,使我们能够通过这一技能获得最大的收益(即最小花费),即s[k~m]的最小值 - s[k] (s[]为这一技能花费的前缀和).我们可以用单调队列来维护这个最小值.…
题目链接:https://ac.nowcoder.com/acm/contest/886/D 题解摘自官方题解 题目大意 有 K 个体积相同的箱子,有 N 个体积相同或相异的物品,现要按照如下策略装箱: 一个一个箱子装,装到不能装了换下一个装. 对于每一个箱子,每次都从剩余物品中找最大的能装进箱子里的物品装进去,直到装不进为止. 求箱子的最小体积. 分析 首先这道题箱子容积和答案没有单调性. 比如:15 5 • 39 39 39 39 39 60 60 60 60 60 100 100 100…
链接:https://www.nowcoder.com/acm/contest/144/C来源:牛客网 Oak is given N empty and non-repeatable sets which are numbered from 1 to N. Now Oak is going to do N operations. In the i-th operation, he will insert an integer x between 1 and M to every set inde…
链接:https://www.nowcoder.com/acm/contest/144/J来源:牛客网 skywalkert, the new legend of Beihang University ACM-ICPC Team, retired this year leaving a group of newbies again. Rumor has it that he left a heritage when he left, and only the one who has at lea…
链接:https://ac.nowcoder.com/acm/contest/887/H来源:牛客网 题目描述 Given three integers A, B, C. Count the number of pairs <x ,y> (with 1≤x≤Aand1≤y≤B) such that at least one of the following is true: - (x and y) > C - (x xor y) < C   ("and", &q…
考的其实是同构图的性质: 1.同构图的顶点数,边数相等 2.同构图通过点的映射后邻接矩阵相同 这篇博客讲的很好https://www.jianshu.com/p/c33b5d1b4cd9 本题还需要一步构造的方案,通过最基础的n=4和n=4+1的图的图推广到n=4k和n=4k+1的状态 #include<bits/stdc++.h> using namespace std; #define maxn 2005 int mp[maxn][maxn]; int n,f[maxn]; int mai…
题意: 给出一棵n个点的树,每条边有边权.对这个树加边变成一个完全图.新加的边的权值为边上两点在树上的距离.求完全图上任意两点的最大流之和. 题解: 一共有C(n,2)个点对.假设当前求s到t之间的最大流,也就是最小割.那么割完之后会是2个连通块,且连通块内部是完全图. 因为是最小割,所以被割掉的边权和最小.即两个连通块内部的边权和最大.那么就会有一个连通块是孤立点,取s和t中到其余所有点距离小的作为孤立点. 问题变成了求每个点到其他所有点的距离. dfs第一次求每个点到他所有儿子节点的距离,d…
题意: 给出n个区间和m个点(点按顺序给出且强制在线).每个区间只会被第一个他包含的点摧毁.问每个点能摧毁多少个区间以及每个区间是被哪个点摧毁的. 题解: 将n个区间按照左端点排序,然后用vector(储存左端点,右端点,id)初始化线段树. 初始化的方法是:对于线段树的n个叶子节点,即为排好序的n个区间.对于其他节点,将左右儿子按照右端点大小归并(归并是线性复杂度). 还要维护每个节点左端点的最小值(用来剪枝)和最大值(用来判断可行性). 每个区间只会被第一个他包含的点摧毁,所以用vis数组标…
一个数很大,并不能预处理,所以要进行公式变换,存前一个的值就好 #include <bits/stdc++.h> using namespace std; typedef long long ll; ,N=1e6+; ll n,m,inv[N]; int main() { inv[]=inv[]=; ; ios::sync_with_stdio(),cout.tie(); cin>>T; ; i<N; ++i) inv[i]=(MD-MD/i)*inv[MD%i]%MD; w…