Logo Joker的博客

博客

复活

2025-03-14 19:54:47 By Joker

呀,咋没有比赛了?

看看新蹦出来哪些大佬啊

模拟比赛 题解(更新D题)

2024-04-27 18:00:35 By Joker

上公告!!!

A.

这道题只是一个普通的模拟题,只需要一个一个判断并计数即可 上代码:

#include<bits/stdc++.h>
using namespace std;  
int n,m,sum=0;
char a[10001][10001];
int main(){
  cin>>n>>m;
  memset(a,'.',sizeof(a));
  for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
      cin>>a[i][j];
  for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
      if(a[i][j]=='#'){
          if(a[i-1][j]=='#'){
            a[i][j]='.';
            a[i-1][j]='.';
            sum++;    
        }
        else if(a[i+1][j]=='#'){
            a[i][j]='.';
            a[i+1][j]='.';
            sum++;    
        }
        else if(a[i][j+1]=='#'){
            a[i][j]='.';
            a[i][j+1]='.';
            sum++;    
        }
        else if(a[i][j-1]=='#'){
            a[i][j]='.';
            a[i][j-1]='.';
            sum++;    
        }
        else{
          a[i][j]='.';
          sum++;
        }
      }
  cout<<sum;
  return 0;
}

B.

这题也很简单,我们计算两个小朋友从两个方向的距离取最小值即可

Tips:记得开long long

#include<bits/stdc++.h>
using namespace std;
int main(){ 
  long long int n,x,y;
  cin>>n;
  long long int a[n+3];
  a[1]=0;
  for(int i=2;i<=n+1;i++){
      scanf("%lld",&a[i]);
      a[i]+=a[i-1];
  }
  long long int k,sum1,sum2;
  cin>>k;
  while(k--){
      scanf("%lld%lld",&x,&y);
      if(x>y)
        swap(x,y);
      sum1=a[y]-a[x];
      sum2=(a[n+1]-sum1)*(n-y+x);
      sum1*=(y-x);
      printf("%lld\n",min(sum1,sum2));
  }
  return 0; 
}

C

这道题不难看出是一个贪心,将数组sort一遍之后再两两分组即可

#include<bits/stdc++.h>
using namespace std; 
int main(){
  int n,ans=0;
  cin>>n;
  int a[n+1];
  for(int i=1;i<=n;i++)
    cin>>a[i];
  sort(a+1,a+n+1);
  for(int i=1;i<=n-1;i+=2)
      ans+=a[i+1]-a[i];
  cout<<ans;
  return 0;
}

D

这题我们想要尽可能少的使用友好操作,所以每次寻找最大的H,在使用操作即可,最后c+1是因为最后一次操作不在while范围内

先上代码:

#include<bits/stdc++.h>
using namespace std;
int n,k,a[200005],b[200005],minl=INT_MAX,maxl=INT_MIN;
int main(){ 
  cin>>n>>k;
  for(int i=1;i<=n;i++){
      cin>>a[i];
      b[a[i]]++;
      maxl=max(maxl,a[i]);
      minl=min(minl,a[i]);
  }
  for(int i=maxl;i>=1;i--)
    b[i]+=b[i+1];
  int sum=0;
  int c=0,h=maxl;
  while(h>minl){
      sum+=b[h];
      if(sum>k){
        h++;
      sum=0;
      c++;    
    }
    else if(sum==k){
      sum=0;
      c++;
    }
    h--;
  }
  cout<<c+1;
  return 0; 
}

E

信息与未来原题,直接暴力做题就可以通过了

#include <bits/stdc++.h>
using namespace std;
int s[7];
int a,b,ss;
bool check(int s[],int j){
    int ji=0,ou=0;
    for(int i=1;i<j;i++){
        if(i%2==1)
            ji+=s[i];
        else
            ou+=s[i];
    }
    if(ji==ou) return true;
    else return false;
} 
int main()
{
   cin>>a>>b;
   for(int i=a;i<=b;i++){
           memset(s,0,sizeof(0));
           int x=i;
           int j=1;
           while(x>0){
               s[j++]=x%10;
               x/=10;
           }
        if(check(s,j)){
            ss++;
        }
   }
   cout<<ss;
   return 0;
}

经过@陈明玮优化过后的代码,舍去了繁琐的数组

陈明玮版
#include <iostream>
using namespace std;
bool lucky(int n){
    int d=0,o=0,w=0;
    while(n){
        w++;
        if(w%2){
            d+=n%10;
        }else{
            o+=n%10;
        }
        n/=10;
    }
    if(o==d)return true;
    else return false;
}
int main(){
    int a,b,cnt=0;
    cin>>a>>b;
    for(int i=a;i<=b;i++){
        if(lucky(i)){
            cnt++;
        }
    }
    cout<<cnt;
    return 0;
}

F

2023信奥原题啊,因为后面的时间比前面的大而且在同一天,难度就降低了很多,轻轻松松就给他A掉 属于有脑就会

#include <bits/stdc++.h>
using namespace std;
string s1,s2; 
int a[12],b[12],t1,t2;
int main()
{
   cin>>s1>>s2;
   for(int i=0;i<s1.size();i+=3){
           if(s1[i]=='0'){
               a[i]=s1[i+1]-'0';
           }
        else{
            a[i]=(s1[i]-'0')*10+s1[i+1]-'0';
        }
   }
   for(int i=0;i<s2.size();i+=3){
           if(s2[i]=='0'){
               b[i]=s2[i+1]-'0';
           }
        else{
            b[i]=(s2[i]-'0')*10+s2[i+1]-'0';
        }
   }
   t1+=a[9]+a[6]*100+a[3]*100*60+a[0]*100*60*60;
   t2+=b[9]+b[6]*100+b[3]*100*60+b[0]*100*60*60;
   cout<<t2-t1;
   return 0;
}

经过@陈明玮优化过后的代码,用scanf的特殊输入,舍去了繁琐的string

陈明玮版
#include <cstdio>
int main(){
    int h1,h2,m1,m2,s1,s2,b1,b2;
    scanf("%d:%d:%d.%d",&h1,&m1,&s1,&b1);
    scanf("%d:%d:%d.%d",&h2,&m2,&s2,&b2);
    printf("%d",(h2*60*60*100+m2*60*100+s2*100+b2)-(h1*60*60*100+m1*60*100+s1*100+b1));
    return 0;
}

这是本蒟蒻第一次写题解,有什么问题就在下方评论哈~

感谢@陈明玮提供的宝贵意见!

@陈明玮

2024-04-26 21:28:30 By Joker

帅呆了,600分实力碾压!

我橙了

2024-04-26 21:17:26 By Joker

消失的月赛

2024-04-21 11:21:16 By Joker

月赛呢

3月1日来打卡啦

2024-03-01 18:32:10 By Joker

Jokerの2100Rating庆!

2024-02-04 19:31:03 By Joker

Joker

Rating

2110

积分

550

Accepted problems:886 problems

2月第一篇BLOG

2024-02-02 16:27:17 By Joker

找到幻灯片中的Kevin_Nanjing

2023-12-17 11:37:26 By Joker

都做完了,结束比赛吧

2023-12-03 18:42:31 By Joker
共 70 篇博客