A-水盐平衡_牛客小白月赛86 (nowcoder.com)
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
int a,b,c,d;
void solve() {cin>>a>>b>>c>>d;if((double)a/b>(double)c/d) cout<<'S'<<endl;else cout<<'Y'<<endl;
}
signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--) {solve();}return 0;
}
B-水平考试_牛客小白月赛86 (nowcoder.com)
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
string s,t;
void solve() {cin>>s>>t;if(t.size()>1){//多选题map<char,int>mp;for(int i=0;i<(int)t.size();i++){mp[t[i]]++;}for(int i=0;i<(int)s.size();i++){if(!mp[s[i]]){//选错不得分cout<<0<<endl;return;}}cout<<10<<endl;}else{//单选题if(s==t) cout<<10<<endl;else cout<<0<<endl;}
}
signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--) {solve();}return 0;
}
C-数组段数_牛客小白月赛86 (nowcoder.com)
长度为n的数组a
m次询问,问区间[l,r]有多少段
段:分成连续的k段,每段元素种类只有一种,k要求最小
前缀和,预处理有几对相邻的后一个不同于前一个
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=2e5+10;
int a[N];
int sum[N];
int n,m;
void solve() {cin>>n>>m;for(int i=1;i<=n;i++) sum[i]=0;for(int i=1;i<=n;i++) cin>>a[i];sum[1]=1;for(int i=2;i<=n;i++){if(a[i]!=a[i-1]) sum[i]=sum[i-1]+1;else sum[i]=sum[i-1];}
// for(int i=1;i<=n;i++) cout<<sum[i]<<' ';
// cout<<endl;while(m--){int l,r;cin>>l>>r;cout<<sum[r]-sum[l]+1<<endl;}
}
signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;
// cin>>t;while(t--) {solve();}return 0;
}
D-剪纸游戏_牛客小白月赛86 (nowcoder.com)
n*m的字符矩阵(点和星号)
星号表示保留的部分
表示被剪去的部分
问减去的图案中有几个矩形
即连通块有几个是矩形
dfs一遍,把一个连通块的每个点的下标记录,行最小是多少,行最大是多少,列最小是多少 ,列最大是多少,然后检查整个矩形里是不是都是点
或者看个数是否等于大矩形的个数
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=1010;
char s[N][N];
int n,m;
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
bool st[N][N];
int minline,maxline,mincol,maxcol;
int cnt;
void dfs(int x,int y){st[x][y]=true;cnt++;minline=min(minline,x);maxline=max(maxline,x);mincol=min(mincol,y);maxcol=max(maxcol,y);for(int i=0;i<4;i++){int tx=x+dx[i],ty=y+dy[i];if(tx<1||tx>n||ty<1||ty>m||st[tx][ty]||s[tx][ty]=='*') continue;dfs(tx,ty);}
}
void solve() {cin>>n>>m;int ans=0;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>s[i][j];}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){minline=2e9,maxline=0,mincol=2e9,maxcol=0;cnt=0;if(!st[i][j]&&s[i][j]=='.'){dfs(i,j);
// cout<<cnt<<endl;
// cout<<minline<<' '<<maxline<<' '<<mincol<<' '<<maxcol<<endl;
// cout<<(maxline-minline+1)*(maxcol-mincol+1)<<endl;
// cout<<"--------"<<endl;if(cnt==(maxline-minline+1)*(maxcol-mincol+1)) ans++;}}}cout<<ans<<endl;
}
signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;
// cin>>t;while(t--) {solve();}return 0;
}
E-可口蛋糕_牛客小白月赛86 (nowcoder.com)
n个蛋糕
wi表示第i个蛋糕的饱腹度,di表示第i个蛋糕的可口值
吃掉一段连续的蛋糕,使得饱腹度之和大于等于W,然后问最大可口值之和是多少
必须连续一段区间,然后由于饱腹度均为正,要使得饱腹度之和大于等于W,区间长度只能长不能短
对于每个点,作为右端点,二分它的左端点至少到哪里,记为l,然后在此基础上,求dp[l-1],表示以[l-1]为右端点,区间和最大是多少,如果dp[l-1]大于0,那么加上
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=1e6+10;
int w[N],d[N];
int dp[N];
int n,W;
int sum[N];
int sum1[N];
void solve() {cin>>n>>W;for(int i=1;i<=n;i++) cin>>w[i];for(int i=1;i<=n;i++) cin>>d[i];for(int i=1;i<=n;i++) sum[i]=sum[i-1]+w[i];for(int i=1;i<=n;i++) sum1[i]=sum1[i-1]+d[i];dp[0]=0;for(int i=1;i<=n;i++) dp[i]=max(d[i],dp[i-1]+d[i]);
// for(int i=1;i<=n;i++) cout<<sum[i]<<' ';
// cout<<endl;
// for(int i=1;i<=n;i++) cout<<sum1[i]<<' ';
// cout<<endl;
// for(int i=1;i<=n;i++) cout<<dp[i]<<' ';
// cout<<endl;
// cout<<"-----------"<<endl;int ans=-1e18;for(int i=1;i<=n;i++){//枚举区间右端点int l=1,r=i;//二分区间左端点while(l<r){int mid=(l+r+1)/2;if(sum[i]-sum[mid-1]>=W) l=mid;else r=mid-1;}
// cout<<l<<' '<<i<<' '<<sum[i]-sum[l-1]<<endl;if(l>=1&&sum[i]-sum[l-1]>=W){ans=max(ans,sum1[i]-sum1[l-1]+max(0ll,dp[l-1]));}}cout<<ans<<endl;
}
signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;
// cin>>t;while(t--) {solve();}return 0;
}