牛客小白月赛89(A~C)

2024-03-23 01:04
文章标签 牛客 89 小白月赛

本文主要是介绍牛客小白月赛89(A~C),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

小白赛怎么这么难打,是什么小白,我的世界小白吗

A. 伊甸之花

给你一个数组 a,问你是否找出一个 不等于 a 的数组 b,满足

其中数值都要在 [1,m] 的范围内

直接在 a 数组上修改,可以发现如果改了 a[1],a[2],那么 a[3] 也要一起修改,所以考虑两个极限情况,一个是全体加一,还有一个是全体减一。

#include <bits/stdc++.h>
//#define int long long
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define debug(a) cout<<#a<<"="<<a<<endl
#define all(x) x.begin(),x.end()
#define EX exit(0)
#define fr first
#define se second
#define endl '\n'
using namespace std;
using ll=long long;void solve(){int n,m;cin>>n>>m;int a[n+1];per(i,1,n)cin>>a[i];per(i,1,n)a[i]++;per(i,1,n){if(a[i]>m){per(j,1,n)a[j]-=2;per(j,1,n){if(a[j]<1){cout<<"No"<<endl;return;}}}}cout<<"Yes"<<endl;
}signed main(){ios::sync_with_stdio(false),cin.tie(nullptr);int t=1;while(t--)solve();return 0;
}

B. 显生之宙

如果是负数,我们希望所有数都加上他,这样最终最小值才会尽可能小。

如果是正数,那么留到最后求和。

考虑先排序,然后如果第一个是负数,就以差分的形式把值保留下来,然后求和。

#include <bits/stdc++.h>
#define int long long
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define debug(a) cout<<#a<<"="<<a<<endl
#define all(x) x.begin(),x.end()
#define EX exit(0)
#define fr first
#define se second
#define endl '\n'
using namespace std;
using ll=long long;void solve(){int n,sum=0;cin>>n;int a[n+1];per(i,1,n)cin>>a[i],sum+=a[i];sort(a+1,a+1+n);if(a[1]>=0){cout<<sum<<endl;}else{int res=a[1],ans=0;per(i,2,n){a[i]+=res;if(a[i]<0)res+=a[i];//如果一直都小于0,那么最后答案就是差分的累计a[n]else ans+=a[i];//如果加了累计的负数还大于0,那么后面都是正数,最终答案为ans}if(ans)cout<<ans<<endl;else cout<<a[n]<<endl;}}signed main(){ios::sync_with_stdio(false),cin.tie(nullptr);int t=1;cin>>t;while(t--)solve();return 0;
}

C. 太阳之华

每次可以选择一个红色连通块向外感染(注意不是所有红色块)。

观察题目所给的数据范围

最差情况感染一次的复杂度是n*m,2e6,一共有100组数据点,总计2e8复杂度,即这题最多进行10次及以下的搜索次数,因此我们向博弈论的方向考虑。

红方先手,然后来回执行。

假设蓝方执行之后,红方再执行可以覆盖所有蓝色,显然不管在中间还是四个角落,只要有一个蓝色块往外延伸一次,就会平局,那么得出结论:

红方必须在一次操作之后覆盖所有蓝色块,否则就是平局。

#include <bits/stdc++.h>
//#define int long long
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define debug(a) cout<<#a<<"="<<a<<endl
#define all(x) x.begin(),x.end()
#define EX exit(0)
#define fr first
#define se second
#define endl '\n'
using namespace std;
using ll=long long;
const int N=2e3+5;int n,m;
string s[N],news[N];bool isok(int x,int y){return x>=1 and x<=n and y>=0 and y<=m-1;
}int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};bool vis[N][N];void dfs(int x,int y){if(vis[x][y])return;vis[x][y]=true;per(i,0,3){int nx=dx[i]+x,ny=dy[i]+y;if(isok(nx,ny) and !vis[nx][ny] and s[nx][ny]=='#')dfs(nx,ny);else if(isok(nx,ny) and s[nx][ny]=='.')news[nx][ny]='#';}
}bool redGo(){per(i,1,n){per(j,0,m-1){//遍历所有的红色连通块,是否能从其中一个使得蓝色全部被覆盖if(s[i][j]=='#' and !vis[i][j]){per(k,1,n)news[k]=s[k];dfs(i,j);int blue=0;per(k,1,n){per(l,0,m-1){blue+=news[k][l]=='.';}}if(blue==0)return true;}}}return false;
}void solve(){cin>>n>>m;//#先手per(i,1,n)cin>>s[i];int red=0;per(i,1,n){per(j,0,m-1){red+=s[i][j]=='#';}}if(red==0){//特判初始状态cout<<"Blue"<<endl;return;}else if(red==n*m){cout<<"Red"<<endl;return;}per(i,1,n){//多组测试点初始化per(j,0,m-1)vis[i][j]=false;}if(redGo()){cout<<"Red"<<endl;return;}cout<<"Draw"<<endl;
}signed main(){ios::sync_with_stdio(false),cin.tie(nullptr);int t=1;cin>>t;while(t--)solve();return 0;
}

这篇关于牛客小白月赛89(A~C)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/836653

相关文章

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

牛客小白月赛100部分题解

比赛地址:牛客小白月赛100_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A.ACM中的A题 #include<bits/stdc++.h>using namespace std;#define ll long long#define ull = unsigned long longvoid solve() {ll a,b,c;cin>>a>>b>

牛客小白月赛100(A,B,C,D,E,F三元环计数)

比赛链接 官方讲解 这场比较简单,ABC都很签到,D是个不太裸需要预处理的 B F S BFS BFS 搜索,E是调和级数暴力枚举,F是三元环计数。三元环考的比较少,没见过可能会偏难。 A ACM中的A题 思路: 就是枚举每个边变成原来的两倍,然后看看两短边之和是否大于第三边即可。 不能只给最短边乘 2 2 2,比如 1 4 8 这组数据,也不能只给第二短边乘 2 2 2,比

笔试强训,[NOIP2002普及组]过河卒牛客.游游的水果大礼包牛客.买卖股票的最好时机(二)二叉树非递归前序遍历

目录 [NOIP2002普及组]过河卒 牛客.游游的水果大礼包 牛客.买卖股票的最好时机(二) 二叉树非递归前序遍历 [NOIP2002普及组]过河卒 题里面给的提示很有用,那个马的关系,后面就注意,dp需要作为long的类型。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publ

每日OJ_牛客_求和(递归深搜)

目录 牛客_求和(递归深搜) 解析代码 牛客_求和(递归深搜) 求和_好未来笔试题_牛客网 解析代码         递归中每次累加一个新的数,如果累加和大于等于目标,结束递归。此时如果累加和正好等于目标,则打印组合。向上回退搜索其它组合。此题本身就是一个搜索的过程,找到所有的组合。 #include <iostream>#include <cmath>#in

牛客《剑指Offer》 -- 数值的整数次方

题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 思路 特别注意负数的情况,出现负数,将其转化为正数然后求倒数。 class Solution {public:double Power(double base, int exponent) {double total = 1;bool flag = false

牛客网《剑指Offer》 二进制中1的个数

题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 思路 负数用补码,其实就是求一个数据在计算机中是存储是怎么样子的。用位运算,就能很好实现。 class Solution {public:int NumberOf1(int n) {int count = 0;int flag = 1;while (flag != 0) {if ((n & f

牛客网《剑指Offer》 矩形覆盖

题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? class Solution {public:int rectCover(int number) {if(number==0) return 0;if(number==1) return 1;if(number==2) return 2;retu

牛客《剑指Offer》 变态跳台阶

题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 思路 根据 普通的跳台阶可以总结出 f(n) = f(n-1) + f(n-2) +f(n-3) + 。。。。+ f(1) +1 不妨设 f(0) = 1 , 则易得 class Solution {public:int jumpFloorII(int n

牛客《剑指Offer》 跳台阶

题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 思路 递归思想,n阶梯子走法等于n-1 加上n-2的。 class Solution {public:int jumpFloor(int number) {if(number==1) return 1;if(number==2) return 2;return jumpFl