牛客小白月赛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=1n​Ca[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. 「土」巨石滚滚 (贪心排序)

贪心思想

排序规则:

  1. 净回复量大的在前
  2. 消耗小的在前
  3. 回复大的在前
#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 题解相关推荐

  1. 牛客小白月赛19 D题 小阳买水果

    链接:https://ac.nowcoder.com/acm/contest/949/D 来源:牛客网 小阳买水果 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他 ...

  2. 牛客小白月赛30题解

    A 黑白边 有n个点,m条边,每条边都分为黑边和白边,现在要选一些边,使得所有点都可以相互连通,要求用白边的条数最少. 看到所有的点都相互连通,就可以想到生成树,所以把所有的白边和黑边分类,先用黑色的 ...

  3. 牛客小白月赛27题解(部分)

    链接:https://ac.nowcoder.com/acm/contest/6874 来源:nowcoder 文章目录 A 巨木之森(树的直径) B 乐团派对(贪心) D 巅峰对决(线段树) E 使 ...

  4. 牛客小白月赛27 题解

    比赛时有点事,赛后补了一下题 A 巨木之森 题意就不复述了, 这题的核心内容就是树的直径. 观察下面的图可以发现,一个点遍历整棵树的路程就是 所有的边*2 - 从这个点出发所到的最远距离.根据树的直径 ...

  5. 牛客小白月赛65个人题解A-E

    1. 牛客小白月赛65 A. 牛牛去购物 题意:给定n元,购买价格为a元的篮球和价格为b的篮球,数量不定,要使得花掉的钱最多,也就是剩余的钱数最少,求这个值 (1 <= n, a, b < ...

  6. 牛客小白月赛60(A~C)题解

    原题地址:牛客小白月赛60_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 题目A:小竹与妈妈 题意:输出(x-b)/a即可,没什么好说 代码: #include< ...

  7. F.孤独(牛客小白月赛39)

    F.孤独(牛客小白月赛39) 题意: 给定一棵树,寻找一个路径,将断掉所有与这个路径上的点相连的边,使得剩下的最大连通块的大小最小 题解: 这题有点印象,感觉做过,至少这个方法肯定遇到过 设dp[u] ...

  8. 牛客小白月赛24 J.建设道路

    牛客小白月赛24 J.建设道路 题目链接 题目描述 牛牛国有 nnn 个城市,编号为 1-n,第 iii 个城市有一个价值 aia_iai​ ,牛国的国王牛阔落特别喜欢在牛牛国旅游,并且他不想每次旅游 ...

  9. 牛客小白月赛27 B.乐团派对

    牛客小白月赛27 B.乐团派对 题目链接 题目描述 音乐是带给大家快乐的存在,而你的目标就是组建若干支乐队,让世界听到你们的演奏! 你目前有 nnn 位乐手,每位乐手只能进入一个乐队,但并不是每位乐手 ...

最新文章

  1. 客户端svn出现authorization failed异常
  2. stm32单片机屏幕一直闪_STM32F407[3] 闪烁LED
  3. cocos2d-x 打包成so文件之后,假设出现错误,能够使用ndk-stack来查看里面的异常...
  4. Swift - 做一个简单的无线U盘(手机端Http服务器搭建)
  5. Android在Context详细解释 ---- 你不知道Context
  6. 批量取出PHP BOM头
  7. (22)VHDL实现比较器(二位数值)
  8. Kubernetes-2018干货盘点
  9. [core java学习笔记][第十一章异常断言日志调试]
  10. 学习数学到底有什么用?
  11. 谷歌浏览器:解决Chrome加载扩展程序提示程序包无效:
  12. 发那科机器人点位编辑_分步详解 | 发那科机器人如何进行零点标定
  13. 找到的比较全的tcp/ip的协议号
  14. 洛谷P4158 [SCOI2009]粉刷匠 题解
  15. CSDN上Android与IPhone开发博客精选
  16. 移动云瞄准“一流云商”焕新出发
  17. kali连接MySQL
  18. 用什么软件能测试cpu好坏,如何检测cpu是否损坏
  19. Java、JSP企业内部邮件系统
  20. PHP获取用户访问IP地址的5种方法

热门文章

  1. 【C++】C++快速入门
  2. 【计算机网络】应用层体系
  3. Rollback RX Pro v12.0 Build 2707819707 系统备份还原工具
  4. 正式毕业第一个offer
  5. 关于Android应用程序内存泄漏 你需要知道的一切
  6. linux项目—基于树莓派的智能家居系统
  7. 设计模式GOF23——克隆模式
  8. 使用小企鹅五笔单字输入模式
  9. 用七步解决所有质量问题
  10. Java基础零碎知识点,有这一篇就够了!