2024牛客寒假算法基础集训营4
A.
直接计算
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f
void solve() {
int a,b,k;cin>>a>>b>>k;
if(a>=k*b)cout<<"good";
else cout<<"bad";
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
//cin>>left;
while(left--){
solve();
}
}
B.
事实上操作次数是固定的,就是数-1
所以计算出操作次数和,若是奇数就是先手赢
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f
void solve() {
int n;cin>>n;
vector<int>a(n+1);
for(int i=1;i<=n;i++)cin>>a[i];
int cnt=0;
for(int i=1;i<=n;i++)cnt+=a[i]-1;
if(cnt&1)cout<<"gui";
else cout<<"sweet";
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
//cin>>left;
while(left--){
solve();
}
}
C.
可以直接模拟
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f
char g[110][110];
void solve() {
int n,m,x,y;cin>>n>>m>>x>>y;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>g[i][j];
}
}
int p,q;cin>>p>>q;
vector<pair<int,int>>v(q+1);
for(int i=1,op,z;i<=q;i++){
cin>>op>>z;
if(op==1){
v[i].first=1;v[i].second=z;
}else{
v[i].first=2;v[i].second=z;
}
}
for(int i=1;i<=p;i++){
for(int j=1;j<=q;j++){
int op=v[j].first,z=v[j].second;
if(op==1){
for(int k=m;k>=1;k--){
g[z][k+1]=g[z][k];
}
g[z][1]=g[z][m+1];
}else{
for(int k=n;k>=1;k--){
g[k+1][z]=g[k][z];
}
g[1][z]=g[n+1][z];
}
}
}
cout<<g[x][y];
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
//cin>>left;
while(left--){
solve();
}
}
D.
相当于自己构造,满足每个数至少为1
我们直接暴力枚举最大公约数
先求出总和,然后把每个数赋值为枚举的数,总和-已经赋值的,
剩下的若是枚举的数的倍数,则枚举数合法
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f
void solve() {
int n;cin>>n;
vector<int>a(n+1);
int sum=0;
for(int i=1;i<=n;i++){
cin>>a[i];
sum+=a[i];
}
if(n==1){
cout<<1;return ;
}
int ans=1;
for(int i=2;i<=200000;i++){
if(n*i<=sum){
int tmp=sum-n*i;
if(tmp==0)ans++;
else if(tmp%i==0)ans++;
}else break;
}
cout<<ans;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
//cin>>left;
while(left--){
solve();
}
}
G.
可以直接模拟,要用前缀和优化
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f
char g[510][510];
int pre[510][510];
void solve() {
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>g[i][j];
if(g[i][j]=='*')pre[i][j]=pre[i][j-1]+1;
else pre[i][j]=pre[i][j-1];
}
}
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(g[i][j]=='*'){
//cout<<"ij="<<i<<' '<<j<<'\n';
for(int k=1;i+k<=n;k++){
int l=j-k,r=j+k;
if(l<1||r>m||g[i+k][l]=='.'||g[i+k][r]=='.'){
//cout<<"&&&\n";
break;
}
if(pre[i+k][r]-pre[i+k][l-1]==r-l+1)ans++;
}
}
}
}
cout<<ans;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
//cin>>left;
while(left--){
solve();
}
}
E.
设a%k=b,那么(a+k)%k=b
前缀和处理这个过程
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f
void solve() {
int n,k;cin>>n>>k;
vector<int>a(n+1),pre(n+1,0);
for(int i=1;i<=n;i++){
cin>>a[i];
pre[i]=pre[i-1]+a[i];
}
set<int>st;
int ans=0;
for(int i=1;i<=n;i++){
st.insert(pre[i-1]%k);
if(st.count(pre[i]%k)){
ans++;
st.clear();
}
}
cout<<ans;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
//cin>>left;
while(left--){
solve();
}
}