AtCoder Beginner Contest 337
ABC337总结
A - Scoreboard
翻译
Takahashi 队和 Aoki 队进行了
输出获胜者。如果两队总得分相同,则输出 Draw
。
分析
将得分分别加起来进行比较即可。
code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int n,m,t,a[N];
int main ()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int x,y;
cin>>x>>y;
m+=x,t+=y;
}
if(m>t) cout<<"Takahashi";
else if(m==t) cout<<"Draw";
else cout<<"Aoki";
return 0;
}
B - Extended ABC
翻译
我们将扩展 A 字符串、扩展 B 字符串、扩展 C 字符串和扩展 ABC 字符串定义如下:
- 如果
中的所有字符都是A
,则字符串 是扩展A
字符串。 - 如果
中的所有字符都是B
,则字符串 是扩展B
字符串。 - 如果
中的所有字符都是C
,则字符串 是扩展C
字符串。 - 如果存在扩展 A 字符串
、扩展 B 字符串 和扩展 C 字符串 ,且按此顺序连接 得到的字符串等于 ,则字符串 是扩展 ABC 字符串。
例如,ABC
、A
和AAABBBCCCCCCC
是扩展 ABC 字符串,但ABBAAAC
和BBBCCCCCCCAAA
不是。请注意,空字符串是扩展 A 字符串、扩展 B 字符串和扩展 C 字符串。
给您一个由 A
、B
和 C
组成的字符串 Yes
;否则输出 No
。
分析
设当前位置为 A
B
C
。
code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int n,m,t,a[N];
int main ()
{
string s;
cin>>s;
int st=1;
for(char c:s)
{
if(c=='A'+t) continue;
if(c>'A'+t) t++;
if(c<'A'+t||t>2)
{
st=0;
break;
}
}
if(st) cout<<"Yes";
else cout<<"No";
return 0;
}
C - Lining Up 2
翻译
有
给你的是长度为
- 如果是
,则 排在队伍的最前面; - 如果是
,则 紧跟在 后面。
从前面到后面输出一行人的编号。
分析
相当于告诉你每个人的前面是谁,直接用链表模拟即可。
code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5;
int n,m,t,a[N],ne[N];
int main ()
{
cin>>n;
memset(ne,-1,sizeof(ne));
for(int i=1;i<=n;i++)
{
cin>>m;
if(m==-1) m=0;
ne[i]=ne[m];
ne[m]=i;
}
for(int i=ne[0];i;i=ne[i]) cout<<i<<" ";
return 0;
}
D - Cheating Gomoku Narabe
有一个网格,网格中有
每个单元格包含一个字符 o
、x
和 .
。写在每个单元格中的字符由长度为
对于此网格,您可以重复以下操作任意多次,可能为零:
- 选择一个带有字符
.
的单元格,并将该单元格中的字符更改为o
。
确定是否有可能在所有单元格中都写上 o
的
- 有一对整数
满足 和 ,使得单元格 中的字符都是o
。 - 有一个满足
和 的整数对 ,使得单元格 中的字符都是o
。
分析
一开始想复杂了,其实暴力求就可以。每行每列分开看,用 o
的数量,用 .
和 o
的数量,当 cnt1--
。最后
code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int n,m,k,ans=N;
string s[N];
int main ()
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++) cin>>s[i],s[i]="0"+s[i];
for(int i=1;i<=n;i++)
{
int cnt1=0,cnt2=0;
for(int j=1;j<=m;j++)
{
if(s[i][j]=='x') cnt1=cnt2=0;
else if(s[i][j]=='o') cnt1++,cnt2++;
else cnt2++;
if(cnt2>k&&s[i][j-k]=='o') cnt1--;
if(cnt2>=k) ans=min(ans,k-cnt1);
}
}
for(int j=1;j<=m;j++)
{
int cnt1=0,cnt2=0;
for(int i=1;i<=n;i++)
{
if(s[i][j]=='x') cnt1=cnt2=0;
else if(s[i][j]=='o') cnt1++,cnt2++;
else cnt2++;
if(cnt2>k&&s[i-k][j]=='o') cnt1--;
if(cnt2>=k) ans=min(ans,k-cnt1);
}
}
if(ans==N) cout<<-1;
else cout<<ans;
return 0;
}
E - Bad Juice
翻译
有
现在你不知道哪杯是发霉的,但明天你要把这些果汁因此你想去坑你的好基友,让他们喝下这些果汁。每个基友可以喝很多杯果汁,每杯果汁可以被很多基友喝。
为了得罪尽量少的人,请求出最少需要给多少基友喝果汁,并构造出一种方案。
接下来用一个字符串 1
代表窜稀,0
代表没有窜稀。你需要据此输出发霉的果汁编号。
交互题。先读入
交互方式示例:
请在输出完毕后使用 fflush(stdout)
或 endl
清空缓冲区,然后再获得下一个输入。
输入 | 输出 | 解释 |
---|---|---|
3 |
给出 |
|
2 |
输出叫的朋友人数。 | |
2 1 2 |
给第一个朋友喝果汁 |
|
1 2 |
给第二个朋友喝果汁 |
|
10 |
给出每个朋友是否肚子疼。 | |
1 |
输出发霉的果汁编号。 |
分析
第一次做交互题,有点新奇但不多,就只需要读入输出再读入再输出就好了。本题方法略微有些新奇(幸好我见过 qwq),要运用二进制的方法,对于第
要注意交互题的一些注意事项。
code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int n,m,t,log_2[N];
string s;
int main ()
{
cin>>n;
for(int i=2;i<=n;i++) log_2[i]=log_2[i>>1]+1;
m=log_2[n-1]+1;
cout<<m<<"\n";
for(int i=0;i<m;i++)
{
int cnt=0;
for(int j=1;j<=n;j++) if((1<<i)&j) cnt++;
cout<<cnt<<" ";
for(int j=1;j<=n;j++) if((1<<i)&j) cout<<j<<" ";
cout<<"\n";
}
cin>>s;
int ans=0;
for(int i=0;i<s.size();i++) if(s[i]=='1') ans+=1<<i;
if(ans==0) ans=n;
cout<<ans;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)