当前位置: 代码迷 >> 综合 >> AtCoder Beginner Contest 096题解(5月5日)
  详细解决方案

AtCoder Beginner Contest 096题解(5月5日)

热度:63   发布时间:2023-11-22 00:50:25.0

A - Day of Takahashi

#include <bits/stdc++.h>
using namespace std;int main()
{int a,b;while(cin>>a>>b){int ans=a-1;if(a<=b) ans++;cout<<ans<<endl;}return 0;
}

B - Maximum Sum

题意:
给定a,b,c三个数,进行k次操作。每次操作都按如下规则进行:
选定一个数值翻倍,其他两个数值不变。

#include <bits/stdc++.h>
using namespace std;const int maxn=3;
int a[maxn];
int main()
{while(cin>>a[0]>>a[1]>>a[2]){int k;cin>>k;sort(a,a+3);int ans=0;ans+=a[0]+a[1];int tmp=1;for(int i=1;i<=k;i++)tmp*=2;ans+=a[2]*tmp;cout<<ans<<endl;}return 0;
}

C - Grid Repainting 2

题意:
如果每一个‘#’的四周都存在元素是‘#’,那么输出“Yes”。否则,输出“No”。

分析:
遍历每一个’#‘元素去判断即可。

#include <bits/stdc++.h>
using namespace std;const int maxn=55;
char s[maxn][maxn];
int n,m;
int dir[4][2]={
   0,1,0,-1,1,0,-1,0};bool valid(int x,int y)
{return x<n&&x>=0 &&y<m&&y>=0;
}
bool ok(int x,int y)
{for(int i=0;i<4;i++){int dx=x+dir[i][0];int dy=y+dir[i][1];if(valid(dx,dy)){if(s[dx][dy]=='#') return true;}}return false;
}
int main()
{while(cin>>n>>m){for(int i=0;i<n;i++)cin>>s[i];bool flag=true;for(int i=0;i<n;i++)for(int j=0;j<m;j++){if(s[i][j]=='#' && !ok(i,j)){flag=false;break;}}if(flag) cout<<"Yes"<<endl;else cout<<"No"<<endl;}return 0;
}

D - Five, Five Everywhere

题意:
输入N,要求输出N个数。N个数满足
(1)每个数都是不超过55555的素数
(2)任意两个数不相等
(3)任选5个数的和是合数

分析:
先打个素数表,从素数表从去选取元素。要求任意5个元素的和是合数,我们可以令每一个元素模5都等于1。

#include <bits/stdc++.h>
using namespace std;
#define MAXN 1000010bool isPrime[MAXN];
long primeList[MAXN];
long ans[MAXN];
int primeCount = 0;void solve()
{memset(isPrime, true, sizeof( isPrime));memset(primeList, 0, sizeof( primeList));memset(ans, 0, sizeof( ans));for(int i=2;i<MAXN;++i){if(isPrime[i]){primeCount = primeCount + 1;primeList[ primeCount] = i;}ans[i] = primeCount;for(int j = 1; j <= primeCount; ++ j){if(i * primeList[j] > MAXN){break;}isPrime[ i * primeList[j]] = false;if(0 == i % primeList[j]){break;}}}ans[0] = ans[1] = 0;return ;
}int a[60];
int main()
{int N,sum=0;solve();while(cin>>N){int x=N;int now=1;for(int i=1; i<=x;){while(primeList[now]%5!=1)now++;a[i++]=primeList[now++];}for(int i=1; i<=x; i++){sum+=a[i];if(i!=x)cout<<a[i]<<" ";elsecout<<a[i]<<endl;}}return 0;
}
  相关解决方案