摘要:题意:求比给出的M大的循环数, 循环数,从位置0开始数arr[0]个数,然后再从位置i数arr[i]个数,最后回到起点解法:简单模拟/*ID: lsswxr1PROG: runroundLANG: C++*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;#define USACO#
阅读全文
摘要:题意:给定整数N,求出将集合[1...N]划分成两组,使得两组和相等的方案的个数解法: 直接枚举时间复杂度达不到要求。采用递推的方法,回忆经典的背包问题 f[i][v] = max{f[i - 1][v], f[i - 1][v - c[i]] + w[i]}即,第i个物品选或者不选,结合前i-1种物品的情况可以递推出所有的结果 将本题转换一下, 所有数的和为sum,那么每一组的和必为sum /2 (如果sum是偶数),问题就是:在[1...N]的集合中找到数字之和 为sum /2 的方案个数, 状态变量: f[i][sum] 在[1...i]集合中和为sum的方案的...
阅读全文
摘要:题意:给定整数N, 采用罗马数字的方式表达,统计每个罗马字符的个数,从小到大输出解法:枚举,统计每一个数字的字符数,然后输出/*ID: lsswxr1PROG: prefaceLANG: C++*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;#define USACO#ifdef
阅读全文
摘要:题意:给出N, b, D。找到N个数字,使得两两之间的汉明距离(Hamming distance)大于等于D,每个编码的位数为b输出要求,每行十个数,且保证数字在b进制下值最小解法:枚举,从1开始(必须包含0),主要是位运算,参考nocow/*ID: lsswxr1PROG: hammingLANG: C++*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include
阅读全文
摘要:题意:给奶牛喂营养素,一共有V种维生素需求,然后有G勺喂养(每勺只喂一次),并给出每勺喂养所获得的对应维生素量,给出至少V种维生素所要达到的需求,求出最少的勺数,如果勺子数相同,勺子编号尽量小解法: 一共G勺(G#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;#define USACO#ifdef..
阅读全文
摘要:IOI经典题目题意:交换排序的方式,如何以最少的次数使得目标序列有序解法:本题目中数字都来自集合{1, 2, 3},将序列排序,统计1, 2, 3的个数,标记为num1, num2, num3统计num1段中2,3的个数,num2段中1,3的个数,num3段中1,2的个数,分别标记为a2,a3,b1,b3,c1,c2对应的pair只需要交换一次就有序分别需要min(a2,b1) min(a3, c1)...等再统计剩余数组中不在本身位置上的个数y,总的个数就是3段pair可交换数之和,以及加上y * 2 / 3/*ID: lsswxr1PROG: sort3LANG: C++*/#includ
阅读全文
摘要:题意:给定正整数N,输出分母小于等于N的“既约真分数”(就是分子分母互质的数)解法:没发现跟graph有什么关系。。后面的分析上给出的求解既约真分数的方法bool rprime(int a, int b){ int r = a % b; while(r != 0){ a = b; b = r; r = a % b; } return(b == 1);}/*ID: lsswxr1PROG: frac1LANG: C++*/#include #include #include #include #include #include #include...
阅读全文
摘要:IOI经典原题题意:一幅城堡中的各个房间,东西南北四个方向都可能会有,没有墙的话视为连通,求解有多少个连通分量,最大房间的大小是多少,同时,如果移除一个墙,最大的房间面积是多少,移除墙的位置在哪儿。注意,移除墙的顺序为自南往北,先北面的墙再东面的墙(题意理解上比较麻烦的地方)2.1的TEXT中讲到了flood fill算法,结合DFS和BFS的基本搜索方法对于本题,先DFS求出所有的连通分量,然后按照题目的要求,顺序搜索移除的墙的位置,得到最优解(官方的解题思路类似)提交了3次。。/*ID: lsswxr1PROG: castleLANG: C++*/#include #include #in
阅读全文
摘要:题意:经典的八皇后问题解法:采用朴素的每一次放置都与前面的所有行进行比较,在N =13的时候时间会爆掉《入门经典》上提供的方法很经典,vis数组的使用,具体见《入门经典》125页/*ID:lsswxr1PROG:checkerLANG:C++*/#include#include#include#includeusing namespace std;#define maxn 15ifstream fin("checker.in");ofstream fout("checker.out");int N, tot;int outputNums;int curP
阅读全文
摘要:题意: 求出给定长度为N的数,使得满足这个数从右边开始一位一位的切掉,剩下的数全部是质数解法:一开始想按照顺序枚举,发现预处理质数的时间就已经很复杂了(最大长度为8,[0, 100000000]),果断搜爆了看了一下解法提示,一位一位的进行搜索,剪枝条件(第一位数只能是2,3,5,7)其余位数只能是(1,3,5,7,9)质数条件的限制,然后进行搜索即可,此时判断质数复杂度大为降低,比前一种思路减少了大量的运行时间,所以不能想得太简单,USACO的题目都是很有质量的/*ID: lsswxr1PROG: sprimeLANG: C++*/#include #include #include #in
阅读全文
摘要:题意:给定区间[a, b]求出区间里面的所有 回文质数解法: 最简单的做法是枚举所有的数字,判断两个条件,但在第9组数据的时候时间会爆 看了一下HINT,题目提示预先产生所有的回文数,将遍历所有数组的时间将为常数时间产生数组,HINT给出的回文数产生方法更为巧妙,采用这样的思路大幅降低了运行时间/*ID: lsswxr1PROG: pprimeLANG: C++*/#include #include #include #include #include #include #include #include #include #include #include #include #include
阅读全文
摘要:题意:经典数字三角形最大问题解法:基本动态规划 dp[i][j]表示以(i,j)结束的最大值, 转移方程:dp[i][j] = max{dp[i-1][j-1], dp[i-1][j]} + num[i][j], 结果为max dp[n - 1][j] 当然也可以设置dp[i][j]表示从(i, j)出发所能获得的最大值 dp[i][j] = max{dp[i+1][j], dp[i+1][j+1]} + num[i][j]USACO题目的复杂度有些跳跃/*ID: lsswxr1PROG: numtriLANG: C++*/#include #include #include #i...
阅读全文
摘要:题意: 给定A,B,C三个杯子的容积(0-20的整数),初始状态为C满牛奶,每一次互相倒必须有一个灌满或者一个为空, 求出所有当A为空的时候,C当前牛奶的状态的数值,从小到大输出解法: 搜索,深度优先和宽度优先都可以。需要一个数组来记录状态的访问情况, 下面采用dfs来进行求解,states数组标记访问状态,ans数组记录结果 /*ID: lsswxr1PROG: milk3LANG: C++*/#include #include #include #include #include #include #include #include #include #include #i...
阅读全文
摘要:题意: 给定等差数列的长度N, 求出满足此长度的等差数列, 其中所有数字来源于集合平方数(即x = a^2 + b^2 a, b都是非负整数) 给定a, b的范围为 0 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;#define USACO#ifdef USACO#define cin f...
阅读全文
摘要:题意:详细见USACO描述解法:作为IOI真题,这道题目确实是非常经典,有许多方法可以求解。基本算法:最容易想到的就是枚举所有情况(4^9复杂度)在时间复杂度上是可以接受的DFS与上面的方法类似BFS,与DFS不同之处在于,由于题目要求找到最短且字典序最小的解,所以BFS一旦搜到答案可以立即返回BFS需要解决的问题:1.如何表征当前状态,常规的作法仍然是数组。string也可以,但时间C++的string时间复杂度太大。2.如何进行状态的比较和复制,如果采用数组的话,可以直接使用memcmp速度更快,同理memcpy3.队列,采用STL的queue4.Hash判重,BFS中关键的一步,一开始想
阅读全文
摘要:题意:竖式乘法解法:简单按照题意枚举模拟即可可以借用一下大数乘法运算方法里面的一些方式[][][] * [][] = 先乘法得到结果, 再统一处理进位/*ID: lsswxr1PROG: crypt1LANG: C++*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;///宏定义c
阅读全文
摘要:题意:给出一篇文章,求略去其中的空格等各种字符(剩余大小写字母后)文中的最长回文子串,输出长度并打印原文中对应的字符串核心:枚举回文串枚举回文串的中点下标是一个比较好的方法,如果反复枚举回文起始点复杂度太大 枚举中点分为两种情况(长度为奇数和偶数),分别处理即可 本题目输入的方式略麻烦/*ID: lsswxr1PROG: calfflacLANG: C++*/#include #include #include #include #include #include #include #include #include #include #include #include #include #i
阅读全文
摘要:题意:约翰的牛棚损坏了需要修补,每个牛棚的宽度是一样的,一共有S个牛棚,供应商能够提供任意长度的木板(一个单位木板覆盖一个牛棚),但总共最多有M个木板,现在牛棚里面还有C头牛,下面C行是每头牛的牛棚的位置。寻找一种方案,使得总共的木板长度最短,覆盖所有的牛。核心:理解题意,条件限制:①最多M个木板②寻找最小的总木板长度因为有C头牛,所以总木板长度最小就为C,问题转化为,增加覆盖某些牛棚,那么长度增加对应的长度,同时满足木板块数不超过M贪心的思路:找出空白的牛棚位置和数目 例如 34_6_8_14...那么第一个空白为7,连续空白为1,第三个空白为 [9,13]长度为5原始状态下有X个空白(X+
阅读全文
摘要:题意:需要收购总数为N的牛奶,现在有M个牛奶供应商(总量足够),给出总数和单价,求最小的花销。核心:基本的贪心解法,按单价排序逐个选取。目的在于熟悉基本的贪心法的基本方法和思路/*ID: lsswxr1PROG: milkLANG: C++*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace
阅读全文
摘要:题意:输入一个N和S,在[S + 1, 10000]范围以内找到N个至少在[2,10]两种进制上面都是回文数的数字核心:仍然是转换十进制到任意进制的算法注意G++下要包含才能找到strcpy等相关的函数/*ID: lsswxr1PROG: dualpalLANG: C++*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include
阅读全文