ACGO欢乐赛#66 非官方题解(G2)
2026-02-09 11:12:18
发布于:河北
本次欢乐赛难度不高,知识点分别为:
| 题号 | 题目 | 难度 | 知识点 |
|---|---|---|---|
| T1 | 皓仔的菱形 | 入门 | 输入输出 |
| T2 | 皓仔和水煮蛋 | 入门 | 分支结构 |
| T3 | 皓仔滑雪 | 入门 | 循环结构 |
| T4 | 皓仔的宝箱清点 | 入门 | 多维数组 |
| T5 | 皓仔的不降数 | 普及- | 循环嵌套 |
| T6 | 皓仔的水果筛选 | 普及- | 贪心 |
T1
本题直接用cout输出即可,记得用endl或/n换行
#include<iostream>
using namespace std;
int main(){
cout<<" *"<<endl;
cout<<" ***"<<endl;
cout<<"*****"<<endl;
cout<<" ***"<<endl;
cout<<" *";
return 0;
}
T2
6分30秒等于390秒,借助此使用判断即可
#include<iostream>
using namespace std;
int main(){
int x;
cin>>x;
if(x<390)cout<<390-x;
else if(x==390)cout<<"perfect";
else cout<<"overcooked";
return 0;
}
T3
使用数组a[100000]来存储高度,并使用for循环遍历数组对连续的两个元素进行判断是否为不升序列
#include<iostream>
using namespace std;
int main(){
int n,a[100000]={};
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
for(int i=1;i<n;i++){
if(a[i]>a[i-1]){
cout<<"NO";
return 0;//减少时间
}
}
cout<<"YES";
return 0;
}
T4
分别使用a[1000][1000]和b[1000][1000]来存储数组和字符数组,并使用分支来判断字符网格中的字符是否为A再根据字符数组中A的位置对数组中的元素进行加和
#include<iostream>
using namespace std;
int main(){
int n,m,a[1000][1000]={};
long long sum=0;
char b[1000][1000]={};
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>b[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(b[i][j]=='A')sum+=a[i][j];
}
}
cout<<sum;
return 0;
}
T5
判断从到的数是否为不降数,可对其进行数位分离,倒着判断,是否为不升数
可通过自定义函数判断
函数部分
bool bujiang(int n){
int i=0,a[7]={};//n最大为10^6,共7位,所以数组大小为7
if(n>=1&&n<=9)return true;//1到9的数字只有1位,一定是不降数
while(n!=0){
a[i]=n%10;
n/=10;
i++;
}
for(int j=1;j<7;j++){
if(a[j]>a[j-1])return false;
}
return true;
}
自定义函数中for循环结束条件为7不会影响结果
举个例子:
对于
123456,
使用自定义函数将数字倒着存储到数组后的结果如下
a[7]={6,5,4,3,2,1,0}
末尾的0由于小于1到9的任何数,不会影响结果
主函数:
#include<iostream>
using namespace std;
int main(){
int n,ans=0;
cin>>n;
for(int i=1;i<=n;i++){
if(bujiang(i))ans++;
}
cout<<ans;
return 0;
}
T6
使用a[1000000]存储水果重量,sort排序后通过二分找到最大值,在找最大值时用max函数更新
#include<iostream>
#include<cmath>//用max
#include<algorithm>//用sort
using namespace std;
int main(){
int n,y,a[1000000]={},max_num=1;
cin>>n>>y;
for(int i=0;i<n;i++)cin>>a[i];
sort(a,a+n);
for(int i=0;i<n;i++){
int left=i,right=n,num=1,jizhun=a[i];
while(left<=right){
int mid=(left+right)/2;
if(a[mid]-jizhun>y)right=mid-1;
else if(a[mid]-jizhun<=y)left=mid+1;
}
num=right-i+1;
max_num=max(num,max_num);
}
cout<<max_num;
return 0;
}
这里空空如也



















有帮助,赞一个