POJ
一些POJ的题
Ctrl AC
I'm sorry for everything, everything I've done.
展开
-
经典例题食物链
题目:clickx吃x+n,x+n吃x+2*n, x+2*n吃x如果x吃y,那么y将会和x+n出现在同一集合中,同理x会出现在y+2*n所在的集合。代码:原创 2022-06-01 12:20:38 · 138 阅读 · 0 评论 -
POJ 4978:宠物小精灵之收服
“ Ctrl AC!一起 AC!”题目:http://noi.openjudge.cn/ch0206/4978/思路:二维01背包,抓的话球和体力同时减掉,否则都不减代码:#include <iostream>#include <algorithm>int num[101];int wei[101];int dp[1001][501];using namespace std;int main(){ int n, m, k; cin原创 2022-04-01 23:31:53 · 433 阅读 · 0 评论 -
POJ 3723 Conscription(最大权森林问题)
“ Ctrl AC!一起 AC!”题目:分析:将每个人看成点,关系看成边,我们将其构成的森林取最大的无环的边就是答案若将边权取反,就相当于求最小生成树代码:#include<bits/stdc++.h>using namespace std;const int maxn=1e6+9;const int mod=1e8+7;int father[50005];int n,m,r;struct node{ int u,v,cost;}edge.原创 2022-03-28 18:55:53 · 431 阅读 · 0 评论 -
POJ 3255 Roadblocks
“ Ctrl AC!一起AC!”题目:思路:用Dijkstra,但是我们每次不仅仅更新最短距离,我们还要更新次短距离。代码:#include<bits/stdc++.h>#define inf 0x3f3f3f3f#define LL long longusing namespace std;typedef pair<int,int> P;const int MAX=1e9+7;const int MAXN=1e6+10;int n,r;s.原创 2022-03-27 19:41:08 · 453 阅读 · 0 评论 -
POJ 1182:食物链
“ Ctrl AC!一起 AC!”题目:忘题戳这分析:一只动物(x)可以成为A,B,C三种情况,假设一共有n只动物,我们设该动物x时为A类动物,x+n时为B类动物,x+2*n时为C类动物。我们规定属于同一集合的动物不矛盾,不同集合的动物之间没有关系。如果x,y是同一类动物,那么最终x,y将在同一个集合,x+n,y+n将在另一个集合,x+2*n,y+2*n将在另一个集合。如果x吃y,那么x,y不能在同一个集合,因为此时它们都是A类动物,x,y+n才是在一个集合的,因为此时x是A类动物,y是B类动物原创 2022-03-26 18:54:23 · 204 阅读 · 0 评论 -
POJ 29:Divisor Problem
“ Ctrl AC!一起 AC!”原题:Divisor ProblemAC代码:#include<bits/stdc++.h>using namespace std;int main(){ int n,m;cin>>n>>m; for(int i=1;i<=n;i++){ if(n%i==0&&n%(m-i)==0){ cout<<i<<" "<<m-i<<endl;原创 2022-02-28 22:34:17 · 134 阅读 · 0 评论 -
POJ 7834:分成互质组
“ Ctrl AC!一起 AC!”原题:忘题戳这分析:对于一个数,遍历所有的互质组,如果可以进入一个组,并保持组内互质,则总组数不变。否则总组数加一。AC代码:#include<bits/stdc++.h>using namespace std;vector<int> v[10000];int cnt=0;bool judge(int x,int y){ int minn=min(x,y); for(int i=minn;i>=2;i--){原创 2022-02-24 22:33:11 · 284 阅读 · 0 评论 -
POJ 9273:PKU2506Tiling(dp高精度)
“ Ctrl AC!一起 AC!”题目:忘题戳这分析:这是一道可以用dp写的题,答案的数值很大,需要用到高精度加法设dp[num][0~len]。其中num指总列数,dp[num][0]表示num列的答案的数的长度,dp[num][1]表示答案数值第一位(最低位)的数值大小,以此类推。易知dp方程为:dp[i][j]=dp[i-1][j]+dp[i-2][j]*2;先预处理,再输入数据。AC代码:#include<iostream>using namespac原创 2022-01-05 15:29:07 · 618 阅读 · 1 评论 -
POJ 8463:Stupid cat & Doge(附对角线翻折研究)
题目:忘题戳这分析:将地图逐层分开研究,递归到第零级后逐渐回溯后,会发现如下规律:升级后若为第一区域,则新坐标为由原坐标沿主对角线翻折得到。升级后若为第二区域,则新坐标为原坐标的纵坐标加上每个区块的边长。升级后若为第三区域,则新坐标为原坐标的横纵坐标分别加上边长。升级后若为第四区域,则新坐标为由原坐标沿副对角线翻折得到。(注意房间号升级后的位置变化就能得出)关于对角线翻折问题不清楚的可以参考博主的另一篇文章:矩阵对角线翻折问题研究...原创 2022-01-10 12:20:45 · 310 阅读 · 0 评论 -
POJ 2722:和数(枚举&set妙用)
“ Ctrl AC!一起 AC!”题目:忘题戳这分析:先把所有数的两两和存放到set集合中去,再将输入的数组和set集合比较,如果set集合中有数组中的某个数,答案就加一。set.find(x):用于寻找数x,如果从头遍历到尾都没找到,那么set.find(x)将==set.end()如果找到了的话,set.find(x)!=set.end()上代码:#include<iostream>#include<set>using namespace std;原创 2022-01-01 20:03:14 · 400 阅读 · 0 评论 -
POJ 1159:Maze
“ Ctrl AC!一起 AC!”题目:忘题戳这分析:可以用bfs,就是将可以走的路存入队列,遇到了门的话把它标记下,先不要开。先把所有能走到路走完,再去看能不能开门,能开门的话,把开门后扩展出的新路存入队列。继续重复该步骤,直到找到终点。队列全空了也找不到,说明无法达到终点。AC代码:#include<iostream>#include<queue>#include<cstring>using namespace std;int dx[] =原创 2022-01-12 21:46:49 · 289 阅读 · 0 评论 -
POJ 07:和为给定数(二分枚举)
“ Ctrl AC!一起 AC!”题目:忘题戳这分析:这是一道典型的二分查找题。我们先对数组排序,再遍历数组。我们要求的和为m,当前遍历到的数为num[i],我们用一个变量保存两者之差 即:delt=m-num[i],我们只需要在这个数组里面找有没有delt就行。因为我们的数组已经从小到大排好序了,所以第一个找到的就是答案。AC代码:#include<iostream>#include<algorithm>using namespace std;int num原创 2022-01-07 22:35:19 · 1029 阅读 · 0 评论 -
POJ 6264:走出迷宫
“ Ctrl AC!一起 AC!”题目:忘题戳这分析:一道典型的寻路广搜模板题,见博主的往日分析AC代码:#include<iostream>#include<queue>using namespace std;struct node { int x, y, step;};//存入队列的位置和步数char map[210][210];//地图int visit[210][210];//访问记录int r1, c1, r2, c2, r, c;//分原创 2022-01-11 23:32:33 · 155 阅读 · 0 评论 -
POJ 1253:Dungeon Master
“ Ctrl AC!一起 AC!”题目:忘题戳这分析:和普通的寻路一样,只要把地图的二维数组变成三维就可以建议先做一下二维寻路再来写这题:参考博客某二维寻路题解AC代码:#include<iostream>#include<cstdio>#include<queue>#include<cstring>using namespace std;struct node { int r, c, z, step;//队列存放的坐标,和步原创 2022-01-13 16:26:26 · 237 阅读 · 0 评论 -
POJ 2988:计算字符串距离
“ Ctrl AC!一起 AC!”题目:忘题戳这分析:这是一道动规题,从小推大。设置一个动规二维数组,首先可以确定数组的一些基础值。dp[i][0]=i,dp[0][i]=i ;因为一个字符串是空串,另一个是长度i的字符串,那他们的距离自然是i。根据基础值,通过状态方程,推出dp[len1][len2]即可。那么状态方程分两种情况,第一种是字符串a的第i+1个元素等于字符串b的第j+1个元素,那么dp[i+1][j+1]=dp[i][j],对吧。如果不同,那么dp[i][j]就是dp[i+1原创 2022-01-15 19:55:12 · 223 阅读 · 0 评论 -
POJ 4980:拯救行动(bfs操作符重载)
“ Ctrl AC!一起 AC!”题目:忘题戳这资料:C++ 操作符重载C++ 优先列队 优先列队中的操作符重载 friend bool分析:正常情况下,寻找最短路径都是用bfs,因为它有一个重要特点:第一次到达的终点的路径即为最短路径,而一般情况下最短路径就是最短时间咯。我们这题是寻找最短时间,但是这题添加的“守卫”元素,使得最短路径与最少时间不能相匹配。所以这里我们需要用到操作符重载改变队列里元素的排列规则,使得能再次...原创 2022-01-14 20:00:42 · 273 阅读 · 0 评论 -
POJ 1788:Pell数列
“ Ctrl AC!一起 AC!”题目:忘题戳这分析:用循环模拟数列的移动,1和2做特殊处理。AC代码:#include<iostream>using namespace std;int main() { int k; cin >> k; int temp; while (k--) { int a1 = 1, a2 = 2;//前两项 int num; cin >> num; if (num == 1) cout <<原创 2022-01-06 19:43:11 · 546 阅读 · 0 评论 -
POJ 7909:统计数字(map法)
“ Ctrl AC!一起 AC!”题目:忘题戳这分析:利用map的关键字与值的对应关系,可以知道每个不同的数就是不同的关键字,数出现的次数就是其对应的值。AC代码:#include<iostream>#include<map>using namespace std;map<int, int> nums;void maptopair() {//这是存入并处理数据的函数 int num; cin >> num; if (nums.fi原创 2022-01-09 20:40:36 · 299 阅读 · 0 评论 -
POJ 6187:称体重(详解)
“ Ctrl AC!一起 AC!”题目:忘题戳这分析:遍历,枚举每个人的体重,但是可以判断大人和小孩,缩小枚举范围。AC代码:#include<iostream>#include<algorithm>using namespace std;struct node { char name; int age;}a[4];bool cmp(struct node a, struct node b) { return a.age < b.age;//根原创 2022-01-04 19:53:26 · 2173 阅读 · 0 评论 -
POJ 6046:数据包的调度机制
题目:>忘题了?戳这里<<" data-link-title=">>忘题了?戳这里<<">>>忘题了?戳这里<<<">前言(屁话):哇哈,写了几十道动态规划,快疯了,以为了解得差不多了,结果又来了个区间动态规划,shit!资料:区间dp详解(转载)我对题目的理解:就是一堆数据包按一定顺序输出,某个包最终延迟等于前面发送的个数乘以该包的基础延迟。求以某个顺序的最小最终延迟和。emm...根据区间d.转载 2021-12-10 16:15:23 · 287 阅读 · 0 评论 -
POJ 6044:鸣人和佐助(dfs)
题目:忘题戳这解法一(dfs):思路:从‘@’开始深搜,搜到‘+’时停止,用每种到达终点的路径的步数stp更新minstep。答案就是minstep剪枝(防超时):1.越界2.该点到过3.查克拉没了4.步数已经大于minstep5.用一个三维数组记录(鸣人所在的横坐标,纵坐标,以及剩余的查克拉数量)某状态的已经走了的步数的最小值。查克拉数量相同时,若到达该点时的步数大于另一种方式走到该点的步数,则剪枝。(即stp>=step[x][y][ckl的数量]).原创 2021-12-21 16:53:20 · 275 阅读 · 0 评论 -
POJ 3531:判断整除
总时间限制:1000ms内存限制:65536kB描述一个给定的正整数序列,在每个数之前都插入+号或-号后计算它们的和。比如序列:1、2、4共有8种可能的序列:(+1) + (+2) + (+4) = 7(+1) + (+2) + (-4) = -1(+1) + (-2) + (+4) = 3(+1) + (-2) + (-4) = -5(-1) + (+2) + (+4) = 5(-1) + (+2) + (-4) = -3(-1) + (-2) + (+4) = 1..原创 2021-12-05 21:01:07 · 617 阅读 · 0 评论 -
POJ 156:LETTERS(dfs)
题目:忘题戳这题目大意:一个表格中每处有字母,从左上角开始走,不能经过重复的字母,看你最多能走多少个格子(包括左上角的起点格子)分析:一道非常典型的搜索题,寻路问题。深搜的同时,根据条件进入深搜(即没走过则进入,走过则跳过)用到的变量大概有,maxpos 记录历史能走的最多的步数,nowpos记录当前走了多少格,visit[i] 记录i点有没有走过,map[i][j]地图,还有行和列r c。小技巧:用字母减"A",即可得到某字母唯一对应的数字,应用于visit下标。AC代码:原创 2021-12-22 22:02:25 · 321 阅读 · 0 评论 -
POJ 4144:畜栏保留问题(附题型必备知识点资料)
Ctrl AC!一起 AC!原题:忘题戳这资料:C++ 操作符重载C++ 优先列队 优先列队中的操作符重载 friend bool分析:贪心,哪头牛先产奶就立即给它安排畜栏。 如果之前的畜栏都没用完,就先给个新的。 如果之前的畜栏有空出来的,就给它这个畜栏。上述用优先队列实现,用队列存畜栏,正在使用中的畜栏最先用完的放在队列最前头(即第一考虑对象,空了就用它,没有就新建)...原创 2021-12-27 22:49:16 · 1168 阅读 · 0 评论 -
POJ 2987:小兔子捡金币(附螺旋矩阵算法研究)
Ctrl AC!一起 AC!题目:忘题戳这资料:螺旋矩阵算法研究资料总结:矩阵从0行0列开始,将矩阵分层,第一层命名为第零层。矩阵的边长为N,i表示第i层,x[i],y[i]为第i个坐标。规律一:矩阵的层数为(N+1)/ 2;规律二:每层的左上角的值最小,其值为2 * i * (2 * N - 2 * i) + 1规律三:某点x,y所在的层数NOceng为:min(min(x[i], y[i]), min(N - x[i] - 1, N - y[i] - 1))规律四:原创 2021-12-28 23:40:13 · 306 阅读 · 0 评论 -
POJ 1700:八皇后问题(深搜经典题)
题目:忘题戳这题目坑点:按行深搜的话要按列输出!!!思路:深搜回溯AC 代码:#include<iostream>using namespace std;int cnt = 1;//方案计数器int chess[8][8];//棋盘情况bool judge(int row, int col);//判断某个位置是否可放void print();//输出函数void dfs(int row) { if (row >= 8) {//深搜结束条件 print()原创 2021-12-25 13:31:49 · 636 阅读 · 0 评论 -
POJ 7218:献给阿尔吉侬的花束(广搜模板题)
题目:忘题戳这废话:开始写搜索题的时候不知道用dfs还是bfs,现在终于懂了一点点点点。资料:dfs与bfs区别题目就不念了,直接上模板:#include<iostream>#include<queue>#include<cstring>using namespace std;struct node { int r, c, step;};//存入队列的位置和步数char map[210][210];//地图int visit[210][2原创 2021-12-24 19:53:20 · 290 阅读 · 0 评论 -
POJ3532:最大上升子序列和
3532:最大上升子序列和总时间限制:1000ms内存限制:65536kB描述一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ...,aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子..原创 2021-12-08 23:17:35 · 163 阅读 · 0 评论 -
POJ 1818:红与黑
题目:忘题戳这分析:一道典型的dfs,通过‘@’进入搜索,遇到‘.’ 且第一次经过 就继续dfs。不过要注意题目是要求先输入列,再输入行。上代码:#include<iostream>#include<cstring>using namespace std;int sum;char pic[25][25];bool visit[25][25];void dfs(int i, int j) { visit[i][j] = 1;//标记这个点走过 //四个原创 2021-12-15 23:39:36 · 847 阅读 · 0 评论 -
POJ最长上升子序列(超简动规法)
1759:最长上升子序列总时间限制:2000ms 内存限制:65536kB描述一个数的序列bi,当b1<b2< ... <bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1,a2, ...,aN),我们可以得到一些上升的子序列(ai1,ai2, ...,aiK),这里1 <=i1<i2< ... <iK<= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, ...原创 2021-11-18 23:28:46 · 164 阅读 · 0 评论