AtCoder Beginner Contest 393(A-D)

AtCoder Beginner Contest 393

  • A-Poisonous Oyster
    • Code
  • B-A..B..C
    • Code
  • C- Make it Simple
    • Code
  • D-Swap to Gather
    • Code
  • 后记

A-Poisonous Oyster

题目

本题很简单,因为 Takahashi 吃了1和2,而 Aoki 吃了1和3,所以他们都为 fine 时,4号就有问题;同理,可以判断那个有问题。

Code

#include 
#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 ji=kj
可得
k = 2 ∗ j − i k=2*j-i k=2ji
所以两层循环即可,然后判断可行性。
时间复杂度为 O ( n 2 ) O(n^2) O(n2)

Code

#include 
#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

题目

题目要满足两个条件:

  1. 无自环
  2. 无重边

自环很好判,但在判重边时需注意它是无向图。

p.s. 因为数据很大所以建议用 map

Code

#include 
#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+cntik,最后输出 a n s ans ans 即可。
时间复杂度为 O ( n ) O(n) O(n)

Code

#include 
#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)因翻译没写出来……

新学期得好好学英语了

你可能感兴趣的:(Atcoder,Beginner,Contest,算法,c++,数据结构)