- 杜昊阳 的博客
寒假思维训练总结day2
- @ 2025-2-5 16:01:04
错题1 错题:章节二 T014
错因:没搞清楚位置关系.
正确思路:画图梳理位置关系,考数学逻辑解决问题.
参考代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,a,b;
cin>>n>>a>>b;
if(n-a<=b+1){
cout<<n-a;
}else{
cout<<b+1;
}
}
错题2 错题:章节二 T019
错因:想的太复杂了,没有找到方法就直接写了.
正确思路:可以从题目知道实际上只需要判断有多个两对, 计算出所有成对的之后再➗2就是最后的结果(因为有四条边).
参考代码:
#include<bits/stdc++.h>
using namespace std;
int a[101];
int main(){
int n,s=0;
cin>>n;
for(int i=0;i<n;i++){
int x;
cin>>x;
a[x]++;
}
for(int i=0;i<100;i++){
s+=a[i]/2;
}
cout<<s/2;
return 0;
}
错题3 错题:章节二 T023
正确思路:暂且设被按下的按钮为,则~的所有灯将被关闭,我们先将他标记,那么在之后的循环中其他按钮的按下不会再改变被标记的状态.
参考代码:
#include<bits/stdc++.h>
using namespace std;
int l[101];
int main(){
int n,m,b[101];
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>b[i];
}
for(int i=1;i<=m;i++){
for(int j=b[i];j<=n;j++){
if(l[j]==0){
l[j]=b[i];
}
}
}
for(int i=1;i<=n;i++){
cout<<l[i]<<" ";
}
}
错题4 错题:章节二 T036
正确思路:先判断是否有四条腿,无则直接变成.判断头身长是否一致,一致则为, 否则为"".
参考代码:
#include<bits/stdc++.h>
using namespace std;
int l[6],v[10];
int main(){
for(int i=1;i<=6;i++){
cin>>l[i];
v[l[i]]++;
}
for(int i=0;i<10;i++){
if(v[i]>=4){
v[i]-=4;
for(int j=0;j<10;j++){
if(v[j]==1){
cout<<"Bear";
return 0;
}else if(v[j]==2){
cout<<"Elephant";
return 0;
}
}
}
}
cout<<"Alien";
return 0;
}
错题5 错题:章节二 T011
错因:没有梳理什么时候线段会重叠
正确思路:画图理清思路自然能出答案.
经画图时间后发现:左边界的最小值>右边界的最大值的时候(即)摄影师才有机会拍到这群人.
参考代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
int n, x;
cin >> n >> x;
int ma = 0;
int mb = 1000;
for(int i=0;i<n;i++){
int a,b;
cin>>a>>b;
if(a>b){
swap(a,b);
}
ma = max(ma, a);
mb = min(mb, b);
}
if(ma>mb){
cout << -1;
}else{
if(x < ma){
cout<<abs(ma-x);
}else if(x > mb){
cout<<abs(mb-x);
}else{
cout<<0;
}
}
return 0;
}
错题6 错题:章节二 T033
正确思路:据题意知就三种情况分别为:$$
124~126~136$$
利用桶数组计算出所有数出现的次数后,从1开始配对
若没有合法的一组直接cout<<-1,以此如法炮制即可.
参考代码:
#include<bits/stdc++.h>
using namespace std;
int a[8];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
int x;
cin>>x;
a[x]++;
}
a[1]=a[1]-a[4];
a[2]=a[2]-a[4];
if(a[2]<0||a[1]<0){
cout<<-1;
return 0;
}
a[1]=a[1]-a[3];
a[6]=a[6]-a[3];
if(a[6]<0||a[1]<0){
cout<<-1;
return 0;
}
if(a[1]==a[2]&&a[2]==a[6]){
while(a[4]--){
cout<<1<<" "<<2<<" "<<4<<endl;
}
while(a[3]--){
cout<<1<<" "<<3<<" "<<6<<endl;
}
while(a[6]--){
cout<<1<<" "<<2<<" "<<6<<endl;
}
return 0;
}else{
cout<<-1;
return 0;
}
}