ACGO欢乐赛#48题解(入门版)
2025-06-01 22:00:37
发布于:浙江
仅使用头文件
#include <iostream>
代码未简化,勿喷
适合新手食用,简单易懂
T1 if语句
#include<iostream>
using namespace std;
int main()
{
int a;
cin>>a;
if(a>=2 and a<=9){
cout<<"YES";
}
else
cout<<"NO";
return 0;
}
T2 数组处理,但是好像不那么复杂?
#include<iostream>
using namespace std;
int main()
{
long long a[200005],b[200005],c[200005],n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n;i++){
cin>>b[i];
}
for(int i=0;i<n;i++){
c[i]=a[i]+b[n-i-1];
}
for(int i=0;i<n;i++){
cout<<c[i]<<' ';
}
return 0;
}
T3 计数就完了
#include<iostream>
using namespace std;
int main()
{
char a[5],k;
int n=0,s;
for(int i=0;i<5;i++){
cin>>k;
s=0;
for(int i=0;i<n;i++){
if(a[i]==k)s++;
}
if(s==0){
a[n]=k;
n++;
}
}
cout<<n;
return 0;
}
T4 6题里最难的(个人向)
#include <iostream>
using namespace std;
int ct(int n) {
bool isPrime[n+1];//建立一个质数数组
for (int i=0;i<n+1;i++){
isPrime[i]=true;
}
isPrime[0]=isPrime[1]=false;
for (int i=2;i*i<=n;++i) {
if (isPrime[i]){
for (int j=i*i;j<=n;j+=i) {
isPrime[j]=false;
}
}
}
int count=0;
for (int i=2;i<= n;i++) {
if (isPrime[i] && n%i==0) {
count++;
while (n%i==0) {
n/=i;
}
}
}
return count;
}
int main() {
int n;
cin>>n;
cout<<ct(n);
return 0;
}
T5 本题关键在于:使用1, 2, 4, 8, ..., 2k这样的二进制数可以组合出任意不超过(2k+1)-1的数。
#include <iostream>
using namespace std;
int m(int n) {
int k=0;
while((1<<(k+1))-1<=n) {
k++;
}
if((1<<k)-1==n) {
return k;
}
else{
return k+1;
}
}
int main() {
int T;
cin>>T;
while (T--) {
int n;
cin>>n;
cout<<m(n)<<endl;
}
return 0;
}
T6(讲的细一点)其实暴力就完了
1.准备工作
#include<iostream>
using namespace std;
int main()
{
int n,a[14][14],cnt=0,c0=0,c1=0;
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
cin>>a[i][j];
}
//主要部分
cout<<cnt;
return 0;
}
2.枚举所有子矩阵:对于每个可能的子矩阵,确定其行和列的范围。
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
for(int k=i;k<n;k++){
for(int l=j;l<n;l++){
//还有呢
}
}
}
}
3.判断平衡:如果0和1的数量相等,则该子矩阵是平衡的,计入总数。
c0=0;c1=0;
for (int x=i;x<=k;x++) {
for (int y=j;y<=l;y++) {
if (a[x][y]==0) {
c0++;
} else {
c1++;
}
}
}
if (c0==c1) {
cnt++;
}
完整代码:
#include<iostream>
using namespace std;
int main()
{
int n,a[14][14],cnt=0,c0=0,c1=0;
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
cin>>a[i][j];
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
for(int k=i;k<n;k++){
for(int l=j;l<n;l++){
c0=0;c1=0;
for (int x=i;x<=k;x++) {
for (int y=j;y<=l;y++) {
if (a[x][y]==0) {
c0++;
} else {
c1++;
}
}
}
if (c0==c1) {
cnt++;
}
/////////
}
}
}
}
cout<<cnt;
return 0;
}
献上彩蛋
蟹蟹各位
本人第一次发帖,给个赞呗
全部评论 4
加油(我也是第一次发比赛题解)
1周前 来自 北京
0%%%
1周前 来自 广东
0今天是我生日!
1周前 来自 浙江
0T5那里文字没打好:T5 本题关键在于:使用1, 2, 4, 8, ..., 2k这样的二进制数可以组合出任意不超过2(k+1)-1的数。
1周前 来自 浙江
0
有帮助,赞一个