【LGR-251-Div.4】洛谷入门赛 #40 解析
已经提交,能够确保正确性。
T1:
矩阵中一共有 个同学,有
个红帽子,则有
个黄帽子,由于不能看到自己,需要
,即
。
代:码:
#include<iostream>
using namespace std;int main(){int a,b;cin>>a>>b;cout<<a*b-a-b;return 0;
}
T2:
先判断两选项之间是否有相同选项,否则判断自己的答案是否存在过,若没有存在过,输出第二大的选项。
#include<iostream>
using namespace std;int main(){int a,b,c,d;cin>>a>>b>>c>>d;if(a==b||a==c||b==c) return cout<<"Report",0;A:;if(a==d) return cout<<"A",0;if(b==d) return cout<<"B",0;if(c==d) return cout<<"C",0;d=a+b+c-max(a,max(b,c))-min(a,min(b,c));goto A;return 0;
}
T3:
使用字符串,从第二位开始判断,如果这一位不是 则输出No,最后都没有退出则输出Yes。
#include<iostream>
using namespace std;int main(){string s;cin>>s;for(int i=1;i<=s.size()-1;i++) if(s[i]!='0') return cout<<"No",0;cout<<"Yes";return 0;
}
T4:
如果发现当前数为 x,则令计数器加 1,如果计数器为 k,输出答案,否则最后输出Error。
#include<iostream>
using namespace std;
int n,k,x,cnt;
int main(){cin>>n;int a[n+1];for(int i=1;i<=n;i++) cin>>a[i];cin>>k>>x;for(int i=1;i<=n;i++){if(a[i]==x) cnt++;if(cnt==k) return cout<<i,0;}cout<<"Error";return 0;
}
T5:

对于每个位置进行判断,如果不满足条件立马退出,否则最后输出Yes。
2025年10月17日22:42:47 修改,在i==n并且a[n]==0时错误,进行特判,否则导致最后一个测试点错误,无法输出正确答案。
#include<iostream>
using namespace std;
int _,n;
bool f=0;
int main() {cin>>_;while(_--) {f=1;cin>>n;int a[n+1];for(int i=1; i<=n; i++) cin>>a[i];for(int i=1; i<=n; i++) {if(i%2==1) {if(a[i]!=a[i+1]) {cout<<"No\n";f=0;break;}} else {if(i!=n&&a[i]==a[i+1]) {cout<<"No\n";f=0;break;}}}if(f) cout<<"Yes\n";}return 0;
}
T6:
对于每个数,将他除以 m 的余数用桶存储起来,最后统计再输出即可。
#include<iostream>
using namespace std;
int n,q,m,ans;
int main() {cin>>n>>q;int a[n+1];for(int i=1;i<=n;i++) cin>>a[i];while(q--){cin>>m,ans=0;bool f[m];for(int i=0;i<m;i++) f[i]=0;for(int i=1;i<=n;i++) f[a[i]%m]=1;for(int i=0;i<m;i++) if(f[i]) ans++;cout<<ans<<"\n";}return 0;
}
T7:
现将中间的数字读取,使用 stack 存储,倒序每一个,取数字,当前数字需要存储,最后答案输出即可。
#include<bits/stdc++.h>
using namespace std;
int n,num,ans;
string s;
stack<char> stk;
int main() {cin>>n;int a[n+1],b[n+1];for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) cin>>b[i];cin>>s;for(int i=0;i<s.size();i++){if(s[i]=='a'||s[i]=='b') stk.push(s[i]);if(s[i]>='0'&&s[i]<='9') num=num*10+s[i]-'0';}while(!stk.empty()){if(stk.top()=='a') ans=a[num];else ans=b[num];num=ans;stk.pop();}cout<<ans;return 0;
}
T8:
考虑使用O1时间计算当前箱子最低的降落位置,即可完成模拟。
#include<bits/stdc++.h>
using namespace std;
int main() {int n,m;cin>>n>>m;string g[n+1];for(int i=0; i<n; ++i) cin>>g[i];for(int j=0; j<m; ++j) {vector<char>r(n,'.');int b=n-1;for(int i=n-1; i>=0; --i) {if(g[i][j]=='-') {r[i]='-';b=i-1;} else if(g[i][j]!='.') {if(b>=0) {r[b]=g[i][j];b--;}}}for(int i=0; i<n; ++i) g[i][j]=r[i];}for(const string&s:g) cout<<s<<'\n';return 0;
}