# AtCoder Beginner Contest 358

A - Welcome to AtCoder Land

#include <iostream>
using namespace std;

int  main() {
string str1, str2;
cin >> str1 >> str2;
if (str1 == "AtCoder" && str2 == "Land") {
cout << "Yes";
}
else {
cout << "No" << endl;
}
}


B - Ticket Counter

#include <iostream>

using namespace std;

int main() {
int n, m;
cin >> n >> m;
int last_time = 0;
for (int i=0;i<n;i++){
int x;
cin >> x;
if (x >= last_time) {
cout << x + m << endl;
last_time = x + m;
}
else {
cout << last_time + m << endl;
last_time = last_time + m;
}
}
return 0;
}

C - Popcorn

Si​ 的 j 个字符是 "o"，则表示 𝑖 摊位出售 𝑗 口味的爆米花。如果是 "x"，则表示 i 摊位不出售 j 口味的爆米花。每个摊位至少出售一种口味的爆米花，每种口味的爆米花至少在一个摊位出售。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
int n, m;
long long s[50];

int main()
{
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
char tmp;
cin >> tmp;
if (tmp == 'o') {
s[i] += (1<<j);
}
}
}
int ans=n;
for (int i=0;i<(1<<n);i++){
int sum=0,cnt=0;
for (int j=0;j<n;j++){
if (i >> j & 1){
cnt++;
sum |= s[j];
}
}
if (sum == (1<<m)-1){
ans=min(ans,cnt);
}
}
cout << ans;
}

#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
#include <cmath>

using namespace std;

typedef long long ll;
typedef pair<int,int> PII;

const int N=1e5+10;

int n,m;
int mn=1e9;
ll a[N];
bool st[N];

void dfs(int u){
if (u==n){
int res=0;
int cnt=0;
for (int i=0;i<n;i++){
if (st[i]==1){
cnt++;
res|=a[i];
}
}
if (res==(1<<m)-1){
mn=min(mn,cnt);
}
return;
}
else{
st[u]=1;
dfs(u+1);
st[u]=0;
dfs(u+1);
}
}

int main (){
cin >> n >> m;
for (int i=0;i<n;i++){
int res=0;
for (int j=m-1;j>=0;j--){
char x;
cin >> x;
if (x=='o'){
res+=(1<<j);
}
}
a[i]=res;
}
dfs(0);
cout << mn << endl;
return 0;
}

D - Souvenirs

• 对于每个 𝑖=1,2,…,𝑀 人， 𝑖i都会得到一个至少装有 𝐵𝑖块糖果的盒子。

#include <iostream>
#include <set>
using namespace std;

multiset<int> A;

int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
int tmp;
cin >> tmp;
A.insert(tmp);
}
long long sum = 0;
for (int i = 0; i < m; i++) {
int tmp;
cin >> tmp;
if (A.lower_bound(tmp) == A.end()) {
cout << -1 << endl;
return 0;
}
sum += *A.lower_bound(tmp);
A.erase(A.lower_bound(tmp));
}
cout << sum << endl;
return 0;
}

E - Alphabet Tiles

• 对于满足 1≤𝑖≤26的每个整数 𝑖，下面的条件成立：
• 设 𝑎𝑖​ 是按词典顺序排列的 𝑖 个大写英文字母。
• 字符串中 𝑎𝑖 的出现次数介于 0 和 𝐶𝑖 之间(包括首尾两次)。

#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
#include <cmath>

using namespace std;

typedef long long ll;
typedef pair<int,int> PII;

const int N=1010;
const ll p=998244353;
ll C[N][N];
ll dp[N][N];
int c[N];
int n;

void init()
{
for (int i = 0; i < N; i ++ )
for (int j = 0; j <= i; j ++ )
if (!j) C[i][j] = 1;
else C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % p;
}

int main (){
cin >> n;
init();
for (int i=1;i<=26;i++) cin >> c[i];
dp[0][0]=1;
for (int i=1;i<=26;i++) {
for (int j=0;j<=n;j++){
for (int k=0;k<=min(j,c[i]);k++){
dp[i][j]+=dp[i-1][j-k]*C[j][k];
dp[i][j]%=p;
}
}
}
ll res=0;
for (int i=1;i<=n;i++){
res+=dp[26][i];
res%=p;
}
cout << res << endl;
return 0;
}


F - Easiest Maze

#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
#include <cmath>

using namespace std;

typedef long long ll;
typedef pair<int,int> PII;

const int N=220;

char map[N][N];

int main (){
int n,m,k;
cin >> n >> m >> k;
if (k-n<0 || (k-n)%2==1){
cout << "No" << endl;
}
else{
cout << "Yes" << endl;

memset(map,'+',N*N);

for (int i=1;i<2*n;i++){
if (i%2==1){
for (int j=1;j<2*m;j++){
if (j%2==1) map[i][j]='o';
else map[i][j]='|';
}
}
else{
for (int j=1;j<2*m;j++){
if (j%2==1) map[i][j]='-';
else map[i][j]='+';
}
map[i][m * 2 - 1] = '.';
}
}
map[0][m*2-1]='S';
map[n*2][m*2-1]='G';
int cnt=k-n;
//对中间行的处理
for (int i = 1; i < n * 2 - 2; i += 4){
for (int j = m * 2 - 1; j >= 3; j -= 2){
if (cnt > 0){
map[i + 1][j] = '-';
map[i][j - 1] = '.';
map[i + 2][j - 1] = '.';
map[i + 1][j - 2] = '.';
cnt -= 2;
}
}
}
//对最后一行的处理
for (int j = 1; j <= m * 2 - 5; j += 4){
if (cnt > 0){
map[n * 2 - 3][j + 1] = '|';
map[n * 2 - 2][j] = '.';
map[n * 2 - 2][j + 2] = '.';
map[n * 2 - 1][j + 1] = '.';
cnt -= 2;
}
}
for (int i=0;i<2*n+1;i++){
for (int j=0;j<2*m+1;j++){
cout << map[i][j];
}
cout << endl;
}
}
return 0;
}


G - AtCoder Tour

• 他要么停留在当前单元格，要么移动到相邻单元格。在这个操作之后，如果他在 (𝑖,𝑗) 单元格中，他将获得 𝐴𝑖,𝑗​ 的趣味值。

#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
#include <cmath>

using namespace std;

typedef long long ll;
typedef pair<int,int> PII;

const ll inf=1e18;
const int N=60;

int n,m,k;
int stx,sty;
int x,y;
ll w[N][N];
ll dp[N][N][2510],ans;
int dx[5]={0,1,0,-1,0},dy[5]={-1,0,1,0,0};

int main (){
cin >> n >> m >> k;
cin >> stx >> sty;
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
cin >> w[i][j];
}
}
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
for(int t=0;t<=2500&&t<=k;t++)dp[i][j][t]=-inf;
}
}
dp[stx][sty][0]=0;
for (int t=0;t<2500 && t<k;t++){
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
for(int c=0;c<5;c++){
x=i+dx[c];
y=j+dy[c];
if(x<1||x>n)continue;
if(y<1||y>m)continue;
dp[x][y][t+1]=max(dp[x][y][t+1],dp[i][j][t]+w[x][y]);
}
}
}
}
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
for(int t=0;t<=2500&&t<=k;t++) ans=max(ans,dp[i][j][t]+w[i][j]*(k-t));
}
}
cout << ans << endl;
return 0;
}

• 28
点赞
• 15
收藏
觉得还不错? 一键收藏
• 2
评论
06-16 773
06-23 910
07-01 282
11-27 221
06-23 1069
07-18 673
07-22 173
07-22 384

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、付费专栏及课程。