自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 ZOJ 4156 Bin Packing Problem (十七届浙江省赛 B )

解题思路:1、对于每次查询需要找的是第一个剩余容量大于等于a[i]a[i]a[i]的盒子,然后将这个物品放入找到的位置,用线段树维护每个盒子的剩余容量,对于非叶子结点就是最大剩余容量,我们需要做的是查询并修改,可以写在一起。2、需要找的是第一个剩余容量大于等于a[i]a[i]a[i]的盒子,用muliset维护,查找是二分muliset即可。代码:#include<bits/stdc++.h>using namespace std;const int maxn = 1e6+10;i

2020-12-05 12:42:51 235

原创 2020 CCF CSP-J2 题解

A.优秀的拆分(power)解题思路:由二进制的性质可得,任何一个数都能有若干个不同二的幂次相加而成,那么就如果是奇数,答案就是-1,否则一定有答案,把二进制的幂次预处理出来,一个个比下是否需要即可。代码:#include<bits/stdc++.h>using namespace std;int main(){ freopen("power.in","r",stdin); //从文件data.in中读入数据 freopen("power.ou

2020-11-08 16:37:32 1051 2

原创 Codeforces Round #681 (Div. 2 题解)

A. Kids Seating题目大意:从1−4∗n1-4*n1−4∗n 这些数中选出nnn个数,任意两个数(a,ba,ba,b)不满足:1、gcd(a,b)=1gcd(a,b)=1gcd(a,b)=12、aaa整除bbb或者bbb整除aaa解题思路:方法貌似很多,我是从后面每两个选出来。代码:#include<bits/stdc++.h>using namespace std;const int maxn = 3e5+10;const int mod = 99824435

2020-11-04 17:10:07 181

原创 UVA11300 Spreading the Wealth 题解

题意:圆桌旁边坐着nn个人,每个人有一定数量的金币,金币的总数能被nn整除。每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数量相等。您的任务是求出被转手的金币的数量的最小值。解题思路:本题要点:1、最后每个人拿到的金币就是每个人初始金币的平均值(设为avgavgavg)。2、对于相邻的两个人只会其中一个给另一个若干金币(两个人都给的话会抵消),不妨设第iii个人给第i−1i-1i−1个人若干金币。3、如果确定了一对相邻人给的金币,那么其它的全部确定。4、答案就是每对相邻的人给的金币的

2020-10-16 16:33:41 255

原创 Educational Codeforces Round 96 E. String Reversal

题意给你一个字符串,每次你能交换两个相邻的字符,问要把这个字符串变的和原来相反,最少需要多少次操作。解题思路:相同的字符的相对位置在交换后不变一定最优,接下来想到冒泡排序,我们每次完成最后一个字符,记录下这个字符在原数组中最后次出现的位置,需要的操作次数就是他们的位置相减,这个字符完成后,原数组在它后面的字符的位置已经都向前移动了一位,我用了树状数组维护,然后只要每次完成最后一个字符就好了。代码:#include<bits/stdc++.h>using namespace std;

2020-10-11 23:12:25 78

原创 Educational Codeforces Round 96 D. String Deletion

题意:给你一段01序列,每次操作(以下是一次操作的两个步骤):1、你选择一个数删去。2、前缀和相同的都删去(例如:110011,就删去前两个1,具体看样例)问最多能执行几次操作。解题思路:我是这样做的:首先如果没有第1步,那么答案就是连续相同段的段数,现在考虑第1步:1、如果当前段连续相同的数字个数超过1,那么我就从中选一个执行第1步(反正这个操作2中也一定会被删去)2、如果当前段连续相同的数字个数只有1,如果我现在删除这个数,那么第二步将会删除下一段相同的数(也就是说答案会减少),那么考虑

2020-10-11 23:07:43 96

原创 Educational Codeforces Round 96 C. Numbers on Whiteboard

题意:给你1、2、3...n1、2、3...n1、2、3...n一共nnn个数,每次操作可以选择两个数a,ba,ba,b拿出,再放入(a+b)/2(a+b)/2(a+b)/2(向上取整)。在n−1n-1n−1次操作后只会剩下一个数,问这个数最小是多少。解题思路:每一次操作,这些数的和就减少(a+b)/2(a+b)/2(a+b)/2,那么贪心,每次选择最大的两个数即可,并且最后答案一定是222。代码:#include<bits/stdc++.h>using namespace std;

2020-10-11 22:53:39 112

原创 Educational Codeforces Round 96 B. Barrels

题意:给你nnn个桶,每个同理开始有一些水,每次操作你可以选择两个桶,将一个桶里的水全部倒入另一个桶(桶的容量无限),你能最多操作kkk次,问这些桶中,水最多的桶和水最少的桶里的水的差是多少。解题思路:显然把水都倒到水最多的那个桶最好,每次都选择除了那个"被倒的桶"外水最多的倒就可以了,那么只要排个序即可。代码:#include<bits/stdc++.h>using namespace std;const int maxn = 2e5+5;const int mod = 1e9

2020-10-11 22:46:03 68

原创 Educational Codeforces Round 96 A.Number of Apartments

题意:给你一个数nnn,能否用若干个3、5、7的和组成。解题思路:考虑3、5、7取模3的余数。如果n%3=0n\%3=0n%3=0,那么只要用n/3n/3n/3个333来组成。如果n%3=1n\%3=1n%3=1,那么一定要用一个777,然后少用两个333就好了,特判n<7n<7n<7。如果n%3=2n\%3=2n%3=2,那么一定要用一个555,然后少用一个333就好了,特判n<5n<5n<5。代码:#include<bits/stdc++.h&g

2020-10-11 22:36:35 73

原创 Codeforces Round #674 (Div. 3) 题解

A. Floor Number题意:有一栋楼,第一层有两个房间(编号1,21,21,2),第二层有xxx个房间(编号3,4,...,2+2∗x3,4,...,2+2*x3,4,...,2+2∗x),以后每一层也都是xxx个房间,现在给你房间编号,输出它得楼层。解题思路:理解题意后直接做就好了。代码:#include<bits/stdc++.h>using namespace std;const int maxn = 1e5+10;int main(){int t;cin&g

2020-09-28 23:28:49 335

原创 Codeforces Round #672 (Div. 2)题解

A. Cubes Sorting题意:给你一个长度为nnn的数组,每次可以选择两个相邻的交换,能否交换不超过n∗(n−1)2−1\frac{n*(n-1)}{2}-12n∗(n−1)​−1次,是整个数组非递减。解题思路:这个类似冒泡排序,最坏情况就是换了n∗(n−1)2\frac{n*(n-1)}{2}2n∗(n−1)​次,所以只有在最坏情况下才不能实现,最坏情况就是原数组递减。代码:#include<bits/stdc++.h> using namespace std;type

2020-09-25 16:17:22 218

原创 Codeforces Round #669 (Div. 2)A-D题解

A. Ahahahahahahahaha题意:一个长度为nnn只包含0和1的序列,你最多可以移出其中n/2n/2n/2个,让下标为奇数的数的和等于下标为偶数的和,题目保证有解。解题思路:我是这样做的,首先如果开始数组就符合条件就直接输出,否则我只删一个数,先求s[i]s[i]s[i]表示第iii个数到最后一个数的奇位数和偶位数的差,接下来枚举要删除的数,如果这个数删除,那么它后面奇位数变成偶位数,偶位数变成奇位数,s[i+1]=−s[i+1]s[i+1]=-s[i+1]s[i+1]=−s[i+1],

2020-09-09 17:15:15 123

原创 Codeforces Round #668 (Div. 2)A-D题解

A. Permutation Forgery题意:给你一个长度为nnn的排列ppp,定义F(p)=sort(p1+p2,p2+p3,......,pn−1+pn)F(p)=sort(p_1+p_2,p_2+p_3,......,p_{n-1}+p_n)F(p)=sort(p1​+p2​,p2​+p3​,......,pn−1​+pn​),其中sort(a1,a2,...,an)sort(a_1,a_2,...,a_n)sort(a1​,a2​,...,an​)表示对a1−ana_1-a_na1​−an​

2020-09-09 16:33:56 196

原创 ZOJ 4110 Strings in the Pocket 题解

传送门题目描述:给你两个字符串s1,s2s1,s2s1,s2,你可以选择一个s1s1s1的子串对它进行反转,使得s1=s2s1=s2s1=s2,问有几种选法。解题思路:预备知识:马拉车算法,不会的话建议百度看看别人的博客。1、首先如果s1!=s2s1!=s2s1!=s2,那么第一个不等的到最后个不等的一点要反转:1)判断把他们反正是否一样,如果不一样,那么答案就是000。2)如果是一样的,这样一定是一个解,那么我们再往两边扩散看看,如果两边一样那又是一个解,不断重复,知道两边不一样。2、如果

2020-09-06 16:41:13 95

原创 力扣(leetcode)第 205 场周赛 题解

A.替换所有的问号解题思路:扫一边过去,当时?时只要填一个和两边都不相等的就可以了,直接枚举要填的字母即可。代码:class Solution {public: string modifyString(string s) { int len = s.size(); for(int i=0;i<len;i++) { if(s[i] == '?') { for(

2020-09-06 13:04:03 193

原创 力扣(leetcode)第 34 场双周赛题解

A.矩阵对角线元素的和解题思路:直接暴力,当变长是偶数是不用减最中间的数,当边长是奇数时要减去最中间的数。比赛的时候没想那么多,看不大就用了各数组标记有没有加过。代码:class Solution {public: int diagonalSum(vector<vector<int>>& mat) { int ans = 0; int n = mat.size(); int vis[105][105];

2020-09-05 23:59:34 141

原创 Codeforces Round #667 (Div. 3) 题解

A. Yet Another Two Integers Problem题目描述:给你两个数a,ba,ba,b,你要通过最少的操作次数把aaa变成bbb,每次操作可以让aaa加上或者减少区间[1,10][1,10][1,10]内的数。解题思路:贪心除了最后次每次加十或减十。代码:#include <bits/stdc++.h>using namespace std;const int maxn=1e6+5;int main(){ int t; cin>>t; w

2020-09-05 18:21:39 170

原创 Codeforces Round #666 (Div. 2) 题解

A. Juggling Letters题目描述:给nnn个字符串,每次操作你能将一个字符串的一个字符移动到任意字符串的任意字符,可以进行无数次操作,请问最后能将所有字符串都变成一样么。解题思路:看懂题目就很简单了,因为可以操作无数次,所以只要判断所有字符的个数是否是nnn的倍数就可以了,如果所有字符的个数是否是nnn的倍数那么一定可以达到要求。代码:#include <bits/stdc++.h>using namespace std;int main(){ int t; c

2020-08-31 18:11:17 206

原创 阿里云 超级码力在线编程大赛初赛 第1场 题解

A.树木规划只需要一遍扫过去,判断这个位置的值是否要移出,记录前一个没有移出的位置,从它们的距离中就能判断了。class Solution {public: /** * @param trees: the positions of trees. * @param d: the minimum beautiful interval. * @return: the minimum number of trees to remove to make trees bea

2020-08-29 12:42:18 110

原创 UVA 12264 题解

题目描述:给你一个无向图,上面每个点都有权值,如果权值为000,则表示这个点是敌方领土,否则这个点就是你的领土,权值就是当前领土你的士兵的人数,有一个操作:每个点的士兵可以不移动,也可以移动一步,但是要保证操作过后每个自己的领土至少有一个士兵。现在在要让边界领土(和敌方领土相邻的领土)中的最少士兵数量尽量大,求这个值。解题思路:首先我们二分答案,接下来就是要判断当前值是否可以满足条件,需要用最大流来完成,我们把每个点iii拆成两个点i,i′i,i'i,i′。iii表示操作前这个点的人数,i′i'i′表

2020-08-26 16:18:21 149

原创 力扣(leetcode)第 203 场周赛 题解

A.圆形赛道上经过次数最多的扇区题目比较长,要认真读题。读懂后,不难发现其实只要求出开始位置和结束位置上所有的点就可以了,因为他们之间的点一定是走过最多的。注意:起始位置可能不是1。class Solution {public: vector<int> mostVisited(int n, vector<int>& rounds) { vector<int> ans; int l=rounds[0];

2020-08-23 13:45:29 201

原创 力扣(leetcode)第 33 场夜喵双周赛 题解

A 千位分隔数模拟,注意答案是000的情况class Solution {public: string thousandSeparator(int n) { int cnt=0; string ans=""; while(n) { if(cnt==3) { ans="."+ans; cnt=0; } cnt++; char mod=n%10+'0'; ans=mod+ans; n/=10; } if(ans=="")ans="0";

2020-08-23 08:53:54 118

原创 Codeforces Round #665D Maximum Distributed Tree题解

题目描述:给你一棵树,你需要将边赋予边权,所有边权的值都要大于0并且它们乘积要是kkk。求所有点对路径的和最大(具体可以看下样例),kkk按质因数分解的形式给出,当时没过是因为没搞懂这一句话的意思the number of 1-s among all n−1 integers must be minimum possible.这句话应是说要让边权为111的边尽量少,就是说如果给出的质数个数小于边数,就只能再给一些边赋边权111。解题思路:不难想到用贪心将要用到边次数多的赋更大的值,那么我们就需要求出每

2020-08-22 11:30:43 103

原创 MMSet2 题解

牛客网题目描述:不难发现课以转换成:给你一颗树,qqq次询问,每次询问给出一些点集,求点集中最大距离,输出(最大距离+1)/2(最大距离+1)/2(最大距离+1)/2;方法一:根据求树的直径的一种方法知道,将任意节点当成根,那么深度最大的一个点一定用到,接下来只要依次求出这个点到其它给出的点的距离,记录最大的即可。那么两点之间的距离如何求呢,其实就是这两个点的深度相加然后减去他们的2*LCA,这个也比较好理解。求LCA的方法这里就不在说明了,可以百度。#include <bits/stdc+

2020-08-20 13:55:29 124

原创 洛谷 P2495 [SDOI2011]消耗战 题解

题目链接题目描述:给你一个有边权的树,若干次询问,每次询问包含一个不含点111的kkk个点的点集,求点111与这些点都不连通的最小代价(删除一些边,代价是他们的权值和)。解题思路:首先考虑如果只有一次询问可以怎么做,不难发现转换为点111为根的树后DP可以实现DP可以实现DP可以实现,设mincast(i)mincast(i)mincast(i)为根到点iii路径上的最小边权,dp(i)dp(i)dp(i)为切断以iii为根的子树上所有给出的点的最小代价。那么对于点iii,1、如果它是给出的点,那

2020-08-20 12:14:00 147

原创 力扣(leetcode)第 202 场周赛 题解

leetcodeA 存在连续三个奇数的数组便利一遍,每次一个变量记录当前几个连续奇数即可。class Solution {public: bool threeConsecutiveOdds(vector<int>& arr) { int c=0; for(int i=0;i<arr.size();i++) { if(arr[i]%2)c++; else c=0; if(c==3)return 1; } return 0; }};B

2020-08-16 20:20:33 124

原创 UVA753 A Plug for UNIX 题解

题目描述:有 nnn 个插座,mmm 个设备和 k(n,m,k≤100)(n,m,k≤100)k (n, m, k \leq 100)(n,m,k \leq 100)k(n,m,k≤100)(n,m,k≤100)种转换器,每种转换器有无限多。已知每个插座的类型,每个设备的插头类型,以及每种转换器的插座类型和插头类型。插头和插座类型都用不超过 2424 个字母表示,插座只能插到类型名称相同的插座中。 例如,有 44 个插座,类型分别为 A,B,C,D;有 5 个设备,插头类型分别为 B,C,B,B,X;还有

2020-08-08 15:46:36 109

原创 UVA658 It‘s not a Bug, it‘s a Feature! 题解

题目描述:补丁在修正BUG时,有时也会引入新的BUG,假定有n(n<=20)n(n<=20) 个潜在BUG,和m(m<=100)m(m<=100) 个补丁,每个补丁用两个长度为nn 的字符串表示,其中字符串的每个位置表示一个bug,第一个串表示打补丁之前的状态(“-”表示该BUG必须不存在,“+”表示该补丁必须存在,0表示无所谓),第二串表示打补丁之后的状态(”-“表示不存在,“+”表示存在,0表示不变)。每个补丁有一定的执行时间,你的任务是用最小的时间把所有BUG都存在的软件变得

2020-08-07 10:20:01 229

原创 UVA1151 Buy or Build 题解

题目描述平面上有nnn个点,你的任务是让所有nnn个点连通,为此,你可以新建一些边,费用等于两个端点的欧几里得距离的平方。另外还有qqq个套餐,可以购买,如果你购买了第iii个套餐,该套餐中的所有结点将变得相互连通,第iii个套餐的花费为cicici。求最小花费。解题思路紫书P358,...

2020-08-05 16:12:05 121

原创 UVA1395 Slim Span(苗条的生成树) 题解

题目描述求所有生成树中最大边权与最小边权差最小的,输出它们的差值。解题思路紫书P358,原来以为很难,看来书发现是个水题,复杂度O(m2∗log(n))O(m^2*log(n))O(m2∗log(n))并不会超时。虽然紫书上已经说的很清楚了,不过还是打算稍微写下:按权值从小到大将边排序,那么对于排序后的边集区间[l,r][l,r][l,r]如果能把点全部连通,那么对于这个边集区间的答案W[r]−W[l]W[r]-W[l]W[r]−W[l]。枚举所有边集区间,复杂度m2m^2m2,在加上判断连通可以用

2020-08-04 17:09:05 126

原创 [USACO20OPEN]Exercise G题解(洛谷P6280)

题面:洛谷P6280解题思路:首先,分析题目发现,某个排列的需要进行恰好 K 步变回原样,这个时候K的值就是这个排序中各个环的长的的最小公倍数(lcm)。例如样例:(2,3,1,5,4)(2,3,1,5,4)(2,3,1,5,4),它分为两个环,分别是(2,3,1)(2,3,1)(2,3,1)和(5,4)(5,4)(5,4),长度分别为333和222那么这时K的值是3∗2=63*2=63∗2=6。其次根据唯一分解,一些数的最小公倍数就是除了111以外其它各个数分解质因数后各个质数的最大次幂相乘,例如

2020-08-03 11:21:49 317

原创 POJ1742 Coins 题解(AcWing 281,hdu 2844)

问题描述:给定N种硬币,其中第 i 种硬币的面值为Ai,共有Ci个。从中选出若干个硬币,把面值相加,若结果为S,则称“面值S能被拼成”。求1~M之间能被拼成的面值有多少个。解题思路:这题很明显是个多重背包问题,只需设dp(i,j)dp(i,j)dp(i,j)为前iii种硬币能否组成面值SSS,根据多重背包的思路可以使用二进制优化每个物品数量可以解决,但是我提交了只在hud上过了,poj和acwing都TLE了。多重背包也能用优先队列优化,我提交后再三个平台都TLE了(???是我写的不够漂亮)?这

2020-07-31 10:59:51 179

原创 POJ1015 Jury Compromise 题解(AcWing280、UVA323)

题目描述:有nnn个物品,每个物品有两个属性ppp和ddd,从这nnn个物品中选取mmm个,记ppp的总和为spspsp,ddd的总和为sdsdsd,要使得∣sp−sd∣|sp-sd|∣sp−sd∣尽量小,如果一样使sp+sdsp+sdsp+sd尽量大,如果还有一样,输出任意组合,输出物品编号并按升序输出。解题思路:设dp(i,j,k)dp(i,j,k)dp(i,j,k)为前iii个物品选了jjj个并且ppp的总和和ddd的总和的差为kkk,(即sp−sdsp-sdsp−sd)时spspsp的最大值(

2020-07-29 10:42:31 154

原创 UVA12105 Bigger is Better 详解

UVA12105 Bigger is Better题目描述:紫书P293用不超过 n(1≤n≤100)n(1 \leq n \leq 100)n(1≤n≤100) 根火柴摆出一个尽量大的、能被 m(1≤m≤3000)m(1 \leq m \leq 3000)m(1≤m≤3000) 整除的数。解题思路方法一:来自紫书,设dp(i,j)dp(i,j)dp(i,j)表示用iii根火柴能拼出除以mmm余数为jjj的最大的数,枚举在对右边添加数字kkk,用dp(i,j)∗10+kdp(i,j)*10+kd

2020-07-24 16:09:50 228

原创 HDU 2191多重背包的单调队列优化详解

多重背包-单调队列优化问题思路代码二维变一维问题已知n个物品的体积w[]、价值v[]、件数c[],一个体积为m的背包,问最多能装下多少价值的东西。裸题:hdu 2191思路设dp[i][j]表示前i个物品中凑成体积小于等于j的最大价值。单调队列优化的重点在于枚举体积时的顺序,外层循环和0-1背包一样,内层循环枚举体积时我们不按正序或者倒序。我们把0-m按照取模当前物体体积分组,例如m=17,当前物体体积v[i]=4,那么就分成:第一组(余数为0):0,4,8,12,16第二组(余数为1):1,

2020-05-20 13:37:50 199

原创 洛谷P5658 括号树,2019 CCF CSP-S2 day1第二题

题目链接https://www.luogu.com.cn/problem/P5658题解通过一个dfs求出以i节点为结尾的合法括号数量(用val[i]表示),由于要求的是子串(开始没注意),所以又用了一个dfs更新val[i]的值为从根节点到i的合法子串数量,并求出答案。最大的问题在于第一个dfs怎么求出val[i],只需用一个数组表示i前一个没有消掉的位置(即p[i],这样就不用再用栈了...

2019-11-27 16:53:32 337

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除