牛客
牛客上的一些题目
shx6666
这个作者很懒,什么都没留下…
展开
-
序列的美观度
题目思路&代码#include<cmath>#include<vector>#include<string>#include<cstring>#include<iostream>#include<algorithm>#define endl '\n'#define BUFF ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)using namespace原创 2021-10-07 19:51:36 · 143 阅读 · 0 评论 -
数字串
题目传送门思路先把所有的可以拆的字母全都拆成两个,判断是否相同;再把所有能合并的字母全都合并,判断是否相同;如果都相同,直接输出-1注意一些特殊的字母,如:j代码#include<cmath>#include<vector>#include<string>#include<cstring>#include<iostream>#include<algorithm>#define endl '\n'#def原创 2021-10-07 15:28:18 · 556 阅读 · 0 评论 -
[NOIP1999]拦截导弹
题目思路就是求最长不上升子序列和最长不上升子序列的最少数量根据dilworth定理我们知道可划分的最少不上升子序列的数目就是其最长下降子序列的长度。代码#include<cmath>#include<vector>#include<string>#include<cstring>#include<iostream>#include<algorithm>#define BUFF ios::sync_with_std原创 2021-10-03 15:54:10 · 144 阅读 · 0 评论 -
D money
题目思路题目要求的是最小的交易次数和最大的利润,所以例如1351 3 5135就只能交易一次,即从1的时候买,5的时候买。首先我们发现,其实无论买卖几次,最大利润都是一样的,因此我们在计算利润的时候就可以直接计算:for(int i=2;i<=n;i++) if (a[i] > a[i - 1]) ans1 += (a[i] - a[i - 1]);说白了就是只要有利润就赚,管他买几次。接下来我们再在得到最大利润的基础上寻找最小买卖次数。我们先设in是买入的标志,那么第一个原创 2021-10-02 20:04:10 · 191 阅读 · 0 评论 -
J 加法和乘法
题目思路首先需要明确,每一次操作都会减少一张卡片,因此在最后一次操作时还剩两张卡片,这两张卡片有三种情况:全是偶数、全是奇数、一奇一偶。如果最后一次是NiuMeiNiuMeiNiuMei,她需要偶数,有三种方法可以获得:奇数+奇数,偶数+偶数,偶数∗奇数奇数+奇数 ,偶数+偶数 ,偶数*奇数奇数+奇数,偶数+偶数,偶数∗奇数,因此无论剩下什么,牛妹都可以赢。如果最后一次是NiuNiuNiuNiuNiuNiu,他需要奇数,有两种方法可以获得:奇数∗奇数,奇数+偶数奇数*奇数,奇数+偶数奇数∗奇原创 2021-10-02 14:41:22 · 332 阅读 · 0 评论 -
G 糖果
题目思路并查集放上一篇写的比较好的博客:链接: https://blog.csdn.net/the_ZED/article/details/105126583.注意findfindfind函数要进行路径压缩代码#include<cmath>#include<vector>#include<string>#include<cstring>#include<iostream>#include<algorithm>原创 2021-10-02 13:25:16 · 78 阅读 · 0 评论 -
D Happy New Year!
题目代码#include<iostream>#include<string>#include<cmath>#include<cstring>#include<algorithm>#include<vector>#define BUFF ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)using namespace std;const int MOD = 2333;原创 2021-10-02 09:23:09 · 104 阅读 · 0 评论 -
饥饿的牛
题目解题思路最长上升子序列状态转移方程dp[i] = max(dp[i], dp[j] + 1);代码#include<iostream>#include<string>#include<cmath>#include<cstring>#include<algorithm>#include<vector>#define BUFF ios::sync_with_stdio(false),cin.tie(0),co原创 2021-09-28 21:46:18 · 134 阅读 · 0 评论 -
「木」迷雾森林
题目解题思路状态转移方程dp[i][j] = max((dp[i + 1][j] + dp[i][j - 1]) % MOD, dp[i][j] % MOD);其他的没啥好说的,记得初始化还有一定要用题目给的快读,要不连样例都过不了代码#include<iostream>#include<string>#include<cmath>#include<cstring>#include<algorithm>#include原创 2021-09-28 21:27:01 · 117 阅读 · 0 评论 -
滑雪
题目解题思路这个题可以用dp,也可以用记忆化搜索,在这里我用的是记忆化搜索。基本就是枚举所有点,然后再用搜索每个点最远可以到达多远的地方,搜索到达的最远距离的时候有点像dfs,就是加上了如果这个点已经搜过了,就直接返回这个点的值:if (dis[x][y] > 1) return dis[x][y];如果没搜过,就基本上和dfs一样了代码#include<iostream>#include<string>#include<cmath>#in原创 2021-09-26 21:43:32 · 67 阅读 · 0 评论 -
花店橱窗
题目解题思路状态转移方程:dp[i][j] = max(dp[i - 1][k] + mp[i][j], dp[i][j]);注意,本题需要回溯代码#include<iostream>#include<string>#include<cmath>#include<algorithm>#include<vector>#define BUFF ios::sync_with_stdio(false),cin.tie(0),co原创 2021-09-24 21:48:58 · 94 阅读 · 0 评论 -
B 括号
题目解题思路根据题目,最多有10510^5105个括号,但是最多要输出10910^9109个括号,因此先输出5∗1045*10^45∗104个左括号,每次在最右边加上一个右括号就多了5∗1045*10^45∗104对括号,然后剩下不足5∗1045*10^45∗104对括号就插在左括号中间。代码#include<iostream>#include<string>#include<cmath>#define BUFF ios::sync_with_stdi原创 2021-09-24 09:24:28 · 204 阅读 · 0 评论 -
F 对答案一时爽
签到题#include<iostream>using namespace std;char NN[109], NM[109];int main() { int cnt = 0; int n; cin >> n; for (int i = 1; i <= n; i++) cin >> NN[i]; for (int i = 1; i <= n; i++) cin >> NM[i]; for (int i = 1; i &l...原创 2021-09-24 09:08:48 · 64 阅读 · 0 评论 -
D 牛牛与整除分块
解题思路:上图是1到50的打表结果从结果中我们可以看出,从1到N\sqrt{N}N每一个数都有,而且是从小到大排列,所以:if(N / x <= sqrt(N)) cout << 总数 - N / x + 1 << endl;但是当x>Nx>\sqrt{N}x>N时,这个时候不一定每个数都存在,但是每个N/xN/xN/x都不一样,此时else cout << x << endl;下面我们还需求出有多少个不同..原创 2021-09-24 09:04:05 · 94 阅读 · 0 评论 -
NC14698 模拟战役
一开始看了半天也没看明白是要干啥,后来才发现就是求齐齐和司机的阵地中有多少块连通块和每个连通块中有几个大炮,用vector来储存每个连通块中有多少大炮,v,size()就是有多少连通块PS:写代码的时候不小心把qq和sj弄混了,WA了十几发#include<vector>#include<iostream>#include<algorithm>using namespace std;const int maxn = 109;int dir[8][2]...原创 2021-03-28 15:19:06 · 93 阅读 · 0 评论 -
NC15029吐泡泡
一个被多组输入搞到崩溃的题#include<iostream>#include<stack>#include<string>#include<cstring>using namespace std;stack<char> a;string s;int main() { while (cin >> s) { int len = s.length(); for (int i = 0;i < len;i..原创 2021-03-16 20:24:25 · 89 阅读 · 0 评论 -
NC16660FBI树
这就是个树,先构造树,输出后序遍历构造树的时候给难了一下,其实就是把S全当作叶子节点,不要管根节点#include<iostream>#include<string>using namespace std;int n;string s;char deal(int l, int r) { char pos1, pos2; int mid = (l + r) >> 1; if (l == r) { if (s[l] == '1') { cou原创 2021-02-19 18:00:44 · 78 阅读 · 0 评论 -
NC14661简单的数据结构
这道题的题目说的有点不清楚链接:https://ac.nowcoder.com/acm/problem/14661来源:牛客网一开始该容器为空,有以下七种操作。1 从前面插入元素a2 从前面删除一个元素3 从后面插入一个元素4 从后面删除一个元素a5 将整个容器头尾翻转6 输出个数和所有元素7 对所有元素进行从小到大排序我们可以用双端队列来实现,下面是基本操作:d.push_back()或d.push_front() 从前面或者后面插入d.pop_back()或d.pop_fr..原创 2021-03-15 20:16:03 · 120 阅读 · 0 评论 -
NC204370牛牛的木板
这是一个经典的窗口滑动问题,尺取法class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int * @param m int * @param a intvector * @return int */ int solve(int n, int m, vector<int>&a..原创 2021-02-27 10:08:51 · 114 阅读 · 0 评论 -
NC53681「土」巨石滚滚
这个题还是一个贪心,但是它贪得太多了,简直是***回归正题:障碍物分为三种:1.损失>回馈2.损失=回馈3.损失<回馈这三种还要有顺序贪的时候肯定是一、先贪第3种,积蓄好力量。贪第三种是也有顺序,要先贪损失小的。二、再贪第2种,顺序无所谓。三、最后贪第1种,贪的时候应该尽量找回馈大的贪,减小损失。还有一件事~~~~~~m要用long long ,不然会卡在这儿:#include<iostream>#include<algorithm>us.原创 2021-02-26 11:24:59 · 83 阅读 · 0 评论 -
NC16649校门外的树
其实这个题可以直接暴力,利用桶排序思想(太简单了,这里就不写了)所以换一种方法:前缀和和差分#include<iostream>using namespace std;const int maxn = 1e4 + 4;int d[maxn];int main() { int len, n; cin >> len >> n; int l, r; while (n--) { cin >> l >> r; d[l]++..原创 2021-02-22 16:26:32 · 73 阅读 · 0 评论 -
NC25043 Protecting the Flower
很简单的一个贪心了,先找出标志,发现是Ti / Di,然后排序就行了#include<iostream>#include<algorithm>using namespace std;const int maxn = 1e5 + 5;struct cow { int t, d;}c[maxn];bool cmp(cow A, cow B) { return A.t * B.d < B.t* A.d;}int main() { int n; ci..原创 2021-02-25 11:24:11 · 69 阅读 · 0 评论 -
NC18979毒瘤xor
这个题还是要根据位运算的特点:可以一位一位分开来算。我们可以先搞出X二进制的每一位,然后再转化为十进制所以这道题就转化为X二进制的每一位应该怎么选题意上说X与L到R的每一位进行异或操作,在这个过程中,我们想获得尽可能多的1,所以根据异或操作的性质,如果这一位1多,那X的这一位就选0如果这一位0多,那X的这一位就选1如果一样多,那就选0#include<iostream>using namespace std;const int maxn = 1e5 + 5;int nu..原创 2021-02-24 21:00:56 · 75 阅读 · 0 评论 -
NC16438回文日期
思路:先构造出月和日,然后根据回文数的规律构造除年,最后判断该年份是否在规定年份内AC代码:原创 2021-02-22 15:13:50 · 99 阅读 · 0 评论 -
NC15553数学考试
这个题有好几种方法,线段树、dp、前缀和这里用的是前缀和有简单的为啥要用难的呢?#include<iostream>#include<cmath>using namespace std;const int maxn = 2e5 + 5;const long long INF = 0x3f3f3f3f3f3f3f3f;long long a[maxn];int main() { int T; cin >> T; while (T--) { .原创 2021-02-23 16:38:12 · 106 阅读 · 0 评论 -
NC20241[SCOL2005]扫雷MINE
这个题是有规律的:第一个雷放上以后,后面放不放雷就能确定了(不相信可以画个图推一下),所以第一个只有两种情况:放和不放,因此ans只有三个值:0、1、2为了检验这种放置方案是否合适,我们可以通过第二列最后一个周围的两个雷来检验。#include<iostream>using namespace std;const int maxn = 1e4 + 4;int n;int a[maxn], b[maxn];bool judge(int x) { a[1] = x; for .原创 2021-02-25 11:12:12 · 89 阅读 · 0 评论 -
NC16561国王的游戏
第一次接触到高精……这真是太难了#include<iostream>#include<algorithm>using namespace std;int n;int l = 1;int g[1000005];struct person { int l, r;}a[100009];bool cmp(person A, person B) { return A.l * A.r < B.l* B.r;}void gj1(int x)//高精度乘..原创 2021-02-22 15:53:23 · 96 阅读 · 0 评论 -
POJ0321棋盘问题
这是一道dfs的题,下面是两个版本#include<iostream>#include<cstring>using namespace std;char map[10][10];int vis[10];int n, k, ans;void dfs(int dep, int cnt) { if (cnt == k) { ans++; return; } if (dep > n) return; for (int i = 1; i <= n; i+..原创 2021-03-29 19:49:03 · 64 阅读 · 0 评论 -
NC53680「金」点石成金
这是一道dfs的题,第一眼看到还以为是一道贪心比赛时的提示:初始魔法值和初始财富值都为0注意这道题的数据范围,有两点需要注意:1.n比较小,可以使用dfs直接搜2.a,b,c,d的值较大,所以要开long long对于每件物品 ,我们直接暴搜,枚举他要不要把这块石头变成金子#include<iostream>#include<cmath>using namespace std;const int maxn = 1e2;typedef long long ll;..原创 2021-03-28 16:15:54 · 104 阅读 · 0 评论 -
NC14380位数差
题目看起来一点也不难但是一这样想就肯定栽跟头拿到题的第一个想法就是暴力,两个for循环,肯定会TLE所以只能另想办法把大问题转换成小问题要用分治还有二分那么ans = solve ( l, mid ) + ( mid , r )#include<iostream>#include<algorithm>using namespace std;typedef long long ll;const int maxn = 1e5 + 5;int com[9], .原创 2021-03-01 15:55:11 · 104 阅读 · 0 评论 -
NC50999表达式计算4
这其实就是一个计算器(简易版)一开始以为不难,但是打脸了????括号太烦人了运用分治思想:找出最低级的运算符然后递归#include<iostream>#include<string>#include<cmath>using namespace std;string s;int change(int l, int r) { int num = 0; for (int i = l;i <= r;i++) num = num * 10原创 2021-02-19 14:50:59 · 103 阅读 · 0 评论 -
NC53676「土」秘法地震
本来打算用暴力写来着,我这差劲的眼力见都没看出来是二维前缀和,练习还是不够啊#include<iostream>using namespace std;const int maxn = 1e4 + 4;char tp[maxn][maxn];int map[maxn][maxn];int main() { int n, m, k; cin >> n >> m >> k; for (int i = 1;i <= n;i++) f.原创 2021-02-26 09:22:54 · 126 阅读 · 0 评论 -
NC14731逆序对
这题就是一个 找规律+快速幂在这里放上一篇dalao的博客吧https://blog.nowcoder.net/n/d97211980f9a4338b6aad39c94e8eec2?f=comment#include<iostream>#include<string>#include<cstring>#include<algorithm>using namespace std;const int mod = 1e9 + 7;typedef..原创 2021-03-01 21:33:16 · 105 阅读 · 0 评论 -
CF538B Quasi Binary
因为输出是每一位最大为1,所以最少就要输出n个,n为原数K:abcd…z中最大的那一个数。Eg:123456 n=6100009 n=9309079 n=9先用数组存每一位,然后哪位用完了就输出0,否则输出1即可。注意要去除先导0#include<iostream>#include<string>#include<cstring>using namespace std;int a[100];int main() { string s; ci.原创 2021-02-26 17:13:25 · 77 阅读 · 0 评论 -
NC16650 采药
原创 2021-04-26 21:19:59 · 71 阅读 · 0 评论 -
Chocolate Eating
这个题的意思是Bessie有n块巧克力,她想分d天吃,每吃一块可以获得Hi的快乐,快乐经过一夜后会减半,问每天最低快乐值最高是多少#include<iostream>using namespace std;const long long INF = 0x3f3f3f3f3f3f3f3f;//一开始写成了int,WA了一晚上const int maxn = 1e6;typedef long long ll;ll n, d, ans;ll h[maxn], c[maxn];...原创 2021-03-10 21:21:07 · 94 阅读 · 0 评论 -
2021-03-17
这个题就是用栈把每次操作后的情况都存起来,然后如果进行操作4就直接把当前状态pop掉,就可以回到前一个状态了#include<iostream>#include<stack>#include<string>#include<cstring>using namespace std;stack<string> s;string tmp;int main() { ios::sync_with_stdio(false); in...原创 2021-03-17 19:24:05 · 56 阅读 · 0 评论 -
NC19916[CQOL2010]扑克牌
这还是一个典型的二分就是设最多可以拼成x副牌,然后通过二分法一个一个去试就行了还有就是题目要求每套牌里最多有1个J,所以还要限制这个条件,所以cnt要小于x#include<iostream>using namespace std;const int INF = 0x3f3f3f3f;typedef long long ll;int n, m;int c[1000009];bool judge(int x) { ll cnt = 0; for (int i = 1;..原创 2021-03-08 21:45:37 · 99 阅读 · 0 评论 -
NC20861兔子的逆序对
首先吐槽:这只兔子的事真多~~~~首先,啊,不对,(假装没写)second,一定要看备注:用快读第三:cout会T,printf不会这其实就是先求出逆序对的数量(就是归并排序),然后就非常简单了(这里有一条重要信息::::一个排序中任意两个元素对换,排列会改变逆序数)于是我们可以在反转区间上找找规律设反转区间的左右区间分别是l,r反转区间元素个数:2(个) 反转元素有 1(对)3(个) 1(对)4(个)原创 2021-02-18 22:06:23 · 155 阅读 · 0 评论 -
NC15136 迷宫
一开始把题意理解错了,结果样例都没过总而言之,这道题要分情况讨论1.直接从S走到E2.先从S走到K,再从K走到E#include<iostream>#include<queue>#include<cstring>using namespace std;const int maxn = 505;bool key;int dis[maxn][maxn];char map[maxn][maxn];int dir[4][2] = { {1,0},{...原创 2021-03-30 21:52:21 · 116 阅读 · 0 评论