AtCoder Beginner Contest 393(A-D)
AtCoder Beginner Contest 393
A-Poisonous Oyster
本题很简单,因为 Takahashi 吃了1和2,而 Aoki 吃了1和3,所以他们都为 fine 时,4号就有问题;同理,可以判断那个有问题。
Code
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1e5+5;
string s1,s2;
int main() {
cin>>s1>>s2;
if(s1=="fine") {
if(s2=="fine") cout<<4;
else cout<<3;
}
else {
if(s2=="fine") cout<<2;
else cout<<1;
}
return 0;
}
B-A…B…C
这是一道典型的三元组,由
j
−
i
=
k
−
j
j−i=k−j
j−i=k−j
可得
k
=
2
∗
j
−
i
k=2*j-i
k=2∗j−i
所以两层循环即可,然后判断可行性。
时间复杂度为
O
(
n
2
)
O(n^2)
O(n2)。
Code
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1e5+5;
string s;
ll n,ans;
int main() {
cin>>s;
n=s.size();
for(ll i=0;i<n;i++) {
if(s[i]!='A') continue;
for(ll j=i+1;j<n;j++) {
if(s[j]!='B') continue;
ll k=j*2-i;
if(k>=n) break;
if(s[k]=='C') ans++;
}
}
cout<<ans;
return 0;
}
C- Make it Simple
题目要满足两个条件:
- 无自环
- 无重边
自环很好判,但在判重边时需注意它是无向图。
p.s. 因为数据很大所以建议用 map。
Code
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=2e5+5;
ll n,m,ans;
struct node{
ll ul,vl;
};
map<pair<ll,ll>,bool> mp;
int main() {
cin>>n>>m;
for(ll i=1;i<=m;i++) {
ll ul,vl;
cin>>ul>>vl;
if(ul==vl) {
ans++;
continue;
}
ll x=min(ul,vl),y=max(ul,vl);
if(mp[{x,y}]==1) ans++;
mp[{x,y}]=1;
}
cout<<ans;
return 0;
}
D-Swap to Gather
我们可以用
a
a
a 数组来统计之前出现的
1
1
1 的个数,即
a
i
a_{i}
ai 表示
i
i
i 之前
1
1
1 的次数,然后我们可以找到最中间的一位
1
1
1 或中间两位
1
1
1 的中间值令为
c
n
t
cnt
cnt;因为每次只能交换字符的上一位和下一位,所以令
k
=
∣
a
[
c
n
t
]
−
a
[
i
]
∣
k=|a[cnt]-a[i]|
k=∣a[cnt]−a[i]∣
然后用
a
n
s
=
a
n
s
+
∣
c
n
t
−
i
∣
−
k
ans=ans+|cnt-i|-k
ans=ans+∣cnt−i∣−k,最后输出
a
n
s
ans
ans 即可。
时间复杂度为
O
(
n
)
O(n)
O(n)。
Code
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=5e5+5;
ll n,ans,cnt,a[N];
string s;
int main() {
cin>>n>>s;
for(ll i=0;i<n;i++) {
if(s[i]=='1') {
ans++;
}
a[i]=a[i-1]+s[i]-'0';
}
if(ans%2==1) {
for(ll i=0;i<n;i++) {
if(s[i]=='1') {
cnt++;
}
if(cnt==ans/2+1) {
cnt=i;
break;
}
}
}
else {
ll lt=0;
for(ll i=0;i<n;i++) {
if(s[i]=='1') {
cnt++;
}
if(cnt==ans/2+1) {
cnt=(i+lt)/2;
break;
}
if(s[i]=='1') {
lt=i;
}
}
}
ans=0;
for(ll i=0;i<n;i++) {
if(s[i]=='1') {
ll k=abs(a[cnt]-a[i]);
if(i<=cnt) {
ans+=(cnt-i-k);
}
else {
ans+=(i-cnt-k);
}
}
}
cout<<ans;
return 0;
}
后记
T5(E)因翻译没写出来……
新学期得好好学英语了。
更多推荐



所有评论(0)