牛客小白月赛19 题解
牛客小白月赛19
- A. 「水」滔天巨浪(思维)
- B. 「木」迷雾森林 (数字三角形模型)
- C. 「土」秘法地震(二维前缀和)
- F. 「水」悠悠碧波 (字符串)
- D. 「金」初心如金 (找规律)
- G. 「金」点石成金 (DFS)
- E. 「火」烈火燎原 (树)
- J. 「火」皇家烈焰 (三维线性DP)
- H. 「土」巨石滚滚 (贪心排序)
A. 「水」滔天巨浪(思维)
要求保证严格单调递增,那么只需要找到一个最大的递增区间,即可,注意一下边界情况 a[l] 和 a[r]
#include<bits/stdc++.h> #define ll long long
#define int ll
#define PI acos(-1.0)
using namespace std;int ksm(int a, int b, int mod) { int s = 1; while(b) {if(b&1) s=s*a%mod;a=a*a%mod;b>>=1;}return s;}
const int inf = 0x3f3f3f3f;
const int N = 20010;int a[N];
signed main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n;cin >> n;for (int i = 1; i <= n; i++) cin >> a[i];int l, r;int maxn = -inf;for (int i = 1; i <= n; i++) {for (int j = i + 1; j <= n; j++) {if (j - i == a[j] - a[i]) {int tmp = j - i + 1;if (tmp > maxn) {maxn = tmp;l = i;r = j;}}}}if (a[l] == 1 || a[r] == 1000) cout << maxn - 1 << endl;else cout << maxn - 2 << endl;return 0;
}
B. 「木」迷雾森林 (数字三角形模型)
经典数字三角形模型 —— 动态规划
细节:看清楚起点是在左下角,我自己做的时候,看成左上角是起点,看图看了半天没看懂。
做这题最大的收获就是白嫖一个 “看起来挺高级的” 快读板
#include<bits/stdc++.h> #define ll long long
//#define int ll
#define PI acos(-1.0)
using namespace std;template<class T>inline void read(T &res)
{char c;T flag=1;while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}
int gcd(int x, int y) { return y ? gcd(y, x % y) : x; }
int ksm(int a, int b, int mod) { int s = 1; while(b) {if(b&1) s=s*a%mod;a=a*a%mod;b>>=1;}return s;}
const int inf = 0x3f3f3f3f;
const int N = 3010;int a[N][N];
int f[N][N];int main()
{int m, n;read(m);read(n);memset(a, 0, sizeof a);for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {read(f[i][j]);}}a[m][1] = 1;for (int i = m; i >= 1; i--) {for (int j = 1; j <= n; j++) {if (f[i][j]) a[i][j] = 0;else a[i][j] += (a[i + 1][j] + a[i][j - 1]) % 2333;}}printf("%d\n", a[1][n]);return 0;
}
C. 「土」秘法地震(二维前缀和)
题意转化:
有建筑物,在这个区域内的和大于0,所以只需要判断这个区域的和是否大于0即可,如果大于0,就会停止魔法。注意一下 k×k 数组的下标。
#include<bits/stdc++.h> #define ll long long
//#define int ll
#define PI acos(-1.0)
using namespace std;template<class T>inline void read(T &res)
{char c;T flag=1;while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}
int gcd(int x, int y) { return y ? gcd(y, x % y) : x; }
int ksm(int a, int b, int mod) { int s = 1; while(b) {if(b&1) s=s*a%mod;a=a*a%mod;b>>=1;}return s;}
const int inf = 0x3f3f3f3f;
const int N = 1010;char c[N][N];
int a[N][N];int qzh(int x1, int y1, int x2, int y2) {return a[x2][y2] - a[x2][y1 - 1] - a[x1 - 1][y2] + a[x1 - 1][y1- 1];
}
int n, m, k;
int main()
{read(n);read(m);read(k);for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {cin >> c[i][j];a[i][j] = a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1] + c[i][j] - '0';}}int cnt = 0;for (int i = 1; i <= n - k + 1; i++) {for (int j = 1; j <= m - k + 1; j++) {if (qzh(i, j, i + k - 1, j + k - 1) > 0) cnt++;}}printf("%d\n", cnt);return 0;
}
F. 「水」悠悠碧波 (字符串)
正反求一遍next数组,枚举每个字串前后缀next。
#include<bits/stdc++.h> #define ll long long
#define int ll
#define PI acos(-1.0)
using namespace std;template<class T>inline void read(T &res)
{char c;T flag=1;while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}
int gcd(int x, int y) { return y ? gcd(y, x % y) : x; }
int ksm(int a, int b, int mod) { int s = 1; while(b) {if(b&1) s=s*a%mod;a=a*a%mod;b>>=1;}return s;}
const int inf = 0x3f3f3f3f;
const int N = 100010;char s[N];
int ne[N];
//int qzh(int x1, int y1, int x2, int y2) {// return a[x2][y2] - a[x2][y1 - 1] - a[x1 - 1][y2] + a[x1 - 1][y1- 1];
//}signed main()
{scanf("%s", s);int len = strlen(s);//kmpint i = 0, j = -1;ne[0] = - 1;while (i < len) {while (j != -1 && s[i] != s[j]) j = ne[j];ne[++i] = ++j;}int t = ne[len];while (t != 0) {s[t] = 0;int f = 0;for (int i = t; i < len - t; i++) {if (ne[i] == t) {f = 1;break;}}if (f) {cout << s << endl;return 0;} else {t = ne[t];}}return 0;
}
D. 「金」初心如金 (找规律)
推理:奇数 ^ 1 = 偶数,奇数 ^ 0 = 奇数
根据后一个的奇偶性判断前一个答案。
#include<bits/stdc++.h> #define ll long long
#define int ll
#define PI acos(-1.0)
using namespace std;template<class T>inline void read(T &res)
{char c;T flag=1;while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}
int gcd(int x, int y) { return y ? gcd(y, x % y) : x; }
int ksm(int a, int b, int mod) { int s = 1; while(b) {if(b&1) s=s*a%mod;a=a*a%mod;b>>=1;}return s;}
const int inf = 0x3f3f3f3f;
signed main()
{int n, x;read(n);read(x);for (int i = 2; i <= n; i++) {read(x);if (x % 2) printf("0\n");else printf("1\n");}return 0;
}
G. 「金」点石成金 (DFS)
总有些题可以通过数据猜算法(就是这道~)
这数据2的15次方
管他三七二十一,直接爆搜就完事。
① +a-b ② -d+c,两种方案,求max
#include<bits/stdc++.h> #define ll long long
#define int ll
#define PI acos(-1.0)
using namespace std;template<class T>inline void read(T &res)
{char c;T flag=1;while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}
int gcd(int x, int y) { return y ? gcd(y, x % y) : x; }
int ksm(int a, int b, int mod) { int s = 1; while(b) {if(b&1) s=s*a%mod;a=a*a%mod;b>>=1;}return s;}
const int inf = 0x3f3f3f3f;const int N = 1000010;
struct stone{int a, b, c, d;
}s[N];
int n;
int dfs(int cur, int w, int mg) {// int kase = 0;
// cout << ++kase << ' ' << w * mg << endl;if (w < 0) w = 0;if (mg < 0) mg = 0;if (cur > n) return w * mg; //财富 * 魔法// cout << w * mg << endl;//1. +a-b//2. -d+c//求max int ans = max(dfs(cur + 1, w + s[cur].a, mg - s[cur].b), dfs(cur + 1, w - s[cur].d, mg + s[cur]. c)) ;return ans;
}
signed main()
{read(n);for (int i = 1; i <= n; i++) {read(s[i].a);read(s[i].b);read(s[i].c);read(s[i].d);}int ans = dfs(1, 0, 0);printf("%lld\n", ans);return 0;
}
E. 「火」烈火燎原 (树)
虽然这道题过的人相对较少,但是,这确确实实是一道水题。
主要是理解题意,差点我就建图了。
看起来嵌套,但其实就三个关系,一个G,X(G),X(X(G));
理解:从G到X(G)的过程 和 从X(G)到X(X(G))的过程
观察规律:G中每个点的度数为:a[i],答案就是 ∑ i = 1 n C a [ i ] 2 \sum_{i=1}^{n}C_{a[i]}^2 ∑i=1nCa[i]2
#include<bits/stdc++.h> #define ll long long
#define int ll
#define PI acos(-1.0)
using namespace std;template<class T>inline void read(T &res)
{char c;T flag=1;while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}
int gcd(int x, int y) { return y ? gcd(y, x % y) : x; }
int ksm(int a, int b, int mod) { int s = 1; while(b) {if(b&1) s=s*a%mod;a=a*a%mod;b>>=1;}return s;}
const int inf = 0x3f3f3f3f;const int N = 100010;int n;
signed main()
{read(n);int ans = 0;for (int i = 1; i <= n - 1; i++) {int u, v;read(u);read(v);a[u]++;a[v]++;}for (int i = 1; i <= n; i++) ans += a[i] * (a[i] - 1) / 2;printf("%lld\n", ans);return 0;
}
J. 「火」皇家烈焰 (三维线性DP)
显然的dp题目,状态转移的时候,与前一位,当前位,后一位都有关系,所以开3维dp
f [ i ] [ 0 / 1 ] [ 0 / 1 ] f[i][0/1][0/1] f[i][0/1][0/1]
表示: f [ 前 i 位 ] [ 当 前 位 是 否 有 雷 ] [ 后 一 位 是 否 有 雷 ] f[前i位][当前位是否有雷][后一位是否有雷] f[前i位][当前位是否有雷][后一位是否有雷]
(0表示没雷,1表示有雷)
初始化: f [ 0 ] [ 0 ] [ 0 ] = 1 , f [ 0 ] [ 0 ] [ 1 ] = 1 f[0][0][0] =1,f[0][0][1] = 1 f[0][0][0]=1,f[0][0][1]=1
分类讨论:
如果 s [ i ] = 0 s[i] = 0 s[i]=0 ,那么代表,当前位,前一位,后一位均无雷
状态转移方程为: f [ i ] [ 0 ] [ 0 ] f[i][0][0] f[i][0][0] += f [ i − 1 ] [ 0 ] [ 0 ] f[i - 1][0][0] f[i−1][0][0] % m o d mod mod
如果 s [ i ] = 1 s[i] = 1 s[i]=1 ,那么代表,当前位无雷,前一位有雷或者后一位有雷,
状态转移方程为:
如果是前一位有雷,后一位无雷: f [ i ] [ 0 ] [ 0 ] f[i][0][0] f[i][0][0] += f [ i − 1 ] [ 1 ] [ 0 ] f[i-1][1][0] f[i−1][1][0] % m o d mod mod
如果是前一位无雷,后一位有雷: f [ i ] [ 0 ] [ 1 ] f[i][0][1] f[i][0][1] += f [ i − 1 ] [ 0 ] [ 0 ] f[i-1][0][0] f[i−1][0][0] % m o d mod mod
如果 s [ i ] = 2 s[i] = 2 s[i]=2 ,那么代表,当前位无雷,前一位和后一位均有雷
状态转移方程为: f [ i ] [ 0 ] [ 1 ] f[i][0][1] f[i][0][1] += f [ i − 1 ] [ 1 ] [ 0 ] f[i-1][1][0] f[i−1][1][0] % m o d mod mod
如果 s [ i ] = ∗ s[i] = * s[i]=∗ ,那么代表,当前位有雷,前一位后一位不清楚
状态转移方程为:
如果后一位无雷: f [ i ] [ 1 ] [ 0 ] f[i][1][0] f[i][1][0] += ( f [ i − 1 ] [ 0 ] [ 1 ] + f [ i − 1 ] [ 1 ] [ 1 ] ) (f[i-1][0][1] + f[i-1][1][1]) (f[i−1][0][1]+f[i−1][1][1]) % m o d mod mod
如果后一位有雷: f [ i ] [ 1 ] [ 1 ] f[i][1][1] f[i][1][1] += ( f [ i − 1 ] [ 0 ] [ 1 ] + f [ i − 1 ] [ 1 ] [ 1 ] ) (f[i-1][0][1] + f[i-1][1][1]) (f[i−1][0][1]+f[i−1][1][1]) % m o d mod mod
如果 s [ i ] = ? s[i] = ? s[i]=? ,那么当前位置不知道,就需要讨论所有情况
如果当前位有雷,下一位无雷: f [ i ] [ 1 ] [ 0 ] f[i][1][0] f[i][1][0] += ( f [ i − 1 ] [ 0 ] [ 1 ] + f [ i − 1 ] [ 1 ] [ 1 ] ) (f[i-1][0][1] + f[i-1][1][1]) (f[i−1][0][1]+f[i−1][1][1]) % m o d mod mod
如果当前位有雷,下一位有雷: f [ i ] [ 1 ] [ 1 ] f[i][1][1] f[i][1][1] += ( f [ i − 1 ] [ 0 ] [ 1 ] + f [ i − 1 ] [ 1 ] [ 1 ] ) (f[i-1][0][1] + f[i-1][1][1]) (f[i−1][0][1]+f[i−1][1][1]) % m o d mod mod
如果当前位无雷,下一位无雷: f [ i ] [ 0 ] [ 0 ] f[i][0][0] f[i][0][0] += ( f [ i − 1 ] [ 0 ] [ 0 ] + f [ i − 1 ] [ 1 ] [ 0 ] ) (f[i-1][0][0] + f[i-1][1][0]) (f[i−1][0][0]+f[i−1][1][0]) % m o d mod mod
如果当前位无雷,下一位有雷: f [ i ] [ 0 ] [ 1 ] f[i][0][1] f[i][0][1] += ( f [ i − 1 ] [ 0 ] [ 0 ] + f [ i − 1 ] [ 1 ] [ 0 ] ) (f[i-1][0][0] + f[i-1][1][0]) (f[i−1][0][0]+f[i−1][1][0]) % m o d mod mod
输出: ( f [ n ] [ 1 ] [ 0 ] + f [ n ] [ 0 ] [ 0 ] ) (f[n][1][0] + f[n][0][0]) (f[n][1][0]+f[n][0][0]) % m o d mod mod 即可
#include<bits/stdc++.h>
using namespace std;
const int N = 1000010;
const int mod = 1e9 + 7;
int f[N][2][2];
int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);string s;cin >> s;s = " " + s;int n = s.size() - 1;f[0][0][0] = 1, f[0][0][1] = 1;for (int i = 1; i <= n; i++) {if (s[i] == '0') f[i][0][0] += f[i - 1][0][0] % mod;else if (s[i] == '1') {f[i][0][0] += f[i - 1][1][0] % mod;f[i][0][1] += f[i - 1][0][0] % mod;} else if (s[i] == '2') f[i][0][1] += f[i - 1][1][0] % mod;else if (s[i] == '*') {f[i][1][0] += (f[i - 1][0][1] + f[i - 1][1][1]) % mod;f[i][1][1] += (f[i - 1][0][1] + f[i - 1][1][1]) % mod;} else if (s[i] == '?') {f[i][1][0] += (f[i - 1][0][1] + f[i - 1][1][1]) % mod;f[i][1][1] += (f[i - 1][0][1] + f[i - 1][1][1]) % mod;f[i][0][0] += (f[i - 1][0][0] + f[i - 1][1][0]) % mod;f[i][0][1] += (f[i - 1][0][0] + f[i - 1][1][0]) % mod;}}cout << (f[n][0][0] + f[n][1][0]) % mod << endl;return 0;
}
H. 「土」巨石滚滚 (贪心排序)
贪心思想
排序规则:
- 净回复量大的在前
- 消耗小的在前
- 回复大的在前
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 500010;struct node{int a, b, c;//a消耗,b回复,c净回复量
}q[N];template<class T>inline void read(T &res) {char c;T flag=1;while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}
bool cmp1(node &a, node &b) {return a.c > b.c;}//净回复量大的
bool cmp2(node &a, node &b) {return a.a < b.a;}//消耗小的
bool cmp3(node &a, node &b) {return a.b > b.b;}//回复大的
signed main()
{int t;read(t);while(t--){int n, m;read(n);read(m);int cnt = 0;for (int i = 1; i <= n; i++) {read(q[i].a);read(q[i].b);q[i].c = q[i].b - q[i].a;if (q[i].c > 0) cnt++;}sort(q + 1, q + n + 1, cmp1);sort(q + 1, q + cnt + 1, cmp2);sort(q + cnt + 1, q + n + 1, cmp3);for (int i = 1; i <= n; i++) {m -= q[i].a;if (m < 0) break;else m += q[i].b;}if(m >= 0) printf("Yes\n");else printf("No\n");}return 0;
}
牛客小白月赛19 题解相关推荐
- 牛客小白月赛19 D题 小阳买水果
链接:https://ac.nowcoder.com/acm/contest/949/D 来源:牛客网 小阳买水果 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他 ...
- 牛客小白月赛30题解
A 黑白边 有n个点,m条边,每条边都分为黑边和白边,现在要选一些边,使得所有点都可以相互连通,要求用白边的条数最少. 看到所有的点都相互连通,就可以想到生成树,所以把所有的白边和黑边分类,先用黑色的 ...
- 牛客小白月赛27题解(部分)
链接:https://ac.nowcoder.com/acm/contest/6874 来源:nowcoder 文章目录 A 巨木之森(树的直径) B 乐团派对(贪心) D 巅峰对决(线段树) E 使 ...
- 牛客小白月赛27 题解
比赛时有点事,赛后补了一下题 A 巨木之森 题意就不复述了, 这题的核心内容就是树的直径. 观察下面的图可以发现,一个点遍历整棵树的路程就是 所有的边*2 - 从这个点出发所到的最远距离.根据树的直径 ...
- 牛客小白月赛65个人题解A-E
1. 牛客小白月赛65 A. 牛牛去购物 题意:给定n元,购买价格为a元的篮球和价格为b的篮球,数量不定,要使得花掉的钱最多,也就是剩余的钱数最少,求这个值 (1 <= n, a, b < ...
- 牛客小白月赛60(A~C)题解
原题地址:牛客小白月赛60_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 题目A:小竹与妈妈 题意:输出(x-b)/a即可,没什么好说 代码: #include< ...
- F.孤独(牛客小白月赛39)
F.孤独(牛客小白月赛39) 题意: 给定一棵树,寻找一个路径,将断掉所有与这个路径上的点相连的边,使得剩下的最大连通块的大小最小 题解: 这题有点印象,感觉做过,至少这个方法肯定遇到过 设dp[u] ...
- 牛客小白月赛24 J.建设道路
牛客小白月赛24 J.建设道路 题目链接 题目描述 牛牛国有 nnn 个城市,编号为 1-n,第 iii 个城市有一个价值 aia_iai ,牛国的国王牛阔落特别喜欢在牛牛国旅游,并且他不想每次旅游 ...
- 牛客小白月赛27 B.乐团派对
牛客小白月赛27 B.乐团派对 题目链接 题目描述 音乐是带给大家快乐的存在,而你的目标就是组建若干支乐队,让世界听到你们的演奏! 你目前有 nnn 位乐手,每位乐手只能进入一个乐队,但并不是每位乐手 ...
最新文章
- 客户端svn出现authorization failed异常
- stm32单片机屏幕一直闪_STM32F407[3] 闪烁LED
- cocos2d-x 打包成so文件之后,假设出现错误,能够使用ndk-stack来查看里面的异常...
- Swift - 做一个简单的无线U盘(手机端Http服务器搭建)
- Android在Context详细解释 ---- 你不知道Context
- 批量取出PHP BOM头
- (22)VHDL实现比较器(二位数值)
- Kubernetes-2018干货盘点
- [core java学习笔记][第十一章异常断言日志调试]
- 学习数学到底有什么用?
- 谷歌浏览器:解决Chrome加载扩展程序提示程序包无效:
- 发那科机器人点位编辑_分步详解 | 发那科机器人如何进行零点标定
- 找到的比较全的tcp/ip的协议号
- 洛谷P4158 [SCOI2009]粉刷匠 题解
- CSDN上Android与IPhone开发博客精选
- 移动云瞄准“一流云商”焕新出发
- kali连接MySQL
- 用什么软件能测试cpu好坏,如何检测cpu是否损坏
- Java、JSP企业内部邮件系统
- PHP获取用户访问IP地址的5种方法