呀,咋没有比赛了?
复活
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
月赛呢