1. 程式人生 > 其它 >AtCoder Beginner Contest 247總結

AtCoder Beginner Contest 247總結

A.Move Right題意是把整個字串向右移一次,最右邊的數消失,左邊補上0;
讀懂題目後,考的是字串的簡單用法。程式碼如下:

#include<bits/stdc++.h>
using namespace std;

int main(){
	string s;
	cin>> s;
	s=s.substr(0,3);
	s="0"+s;
	cout<<s;
	return 0;
}

B.Unique Nicknames題目意思是一個人的姓或名至少有一個要與其它人的姓或名都不同才能做為這個人的暱稱,問是否所有的人都能取暱稱。
統計次數的題目首先想到用MAP,然後再根據題意做模擬,程式碼如下:

#include<bits/stdc++.h>
using namespace std;
string a[110],b[110];
map<string,int>cnt;
int main(){
	int n;
	cin>>n;
	for(int i =0;i<n;i++){
		cin>>a[i]>>b[i];
		cnt[a[i]]++;
		cnt[b[i]]++;
	}

	for(int i =0 ;i <n ; i++){	
		if(a[i]==b[i]){
			if(cnt[a[i]]>2){
			cout<<"No";
			return 0;	
			}
		}
		else if(cnt[a[i]]>1&&cnt[b[i]]>1){
			cout<<"No";
			return 0;
		}
	}
		

	cout<<"Yes";

	return 0;
}

C.1 2 1 3 1 2 1
題目意思是讓你構造個數列,滿足Sn-1,N,Sn-1;
單純考的是遞迴應用,程式碼如下:

#include<bits/stdc++.h>
using namespace std;

void solve(int n){
	if(n==1){
		cout<<1<<" ";
		return;
	}
	solve(n-1);
	cout<<n<<" ";
	solve(n-1);
}


int main(){
	int n;
	cin>>n;
	solve(n);
	return 0;
}

D.Cylinder
題目意思是開頭是1就把C個標X數的球入隊,開關是2就把C個球出隊,每次詢問輸出一次出隊球的標記數之和。
看資料範圍,直接模擬一定超時,所以把指示用PAIR存入佇列,出隊時再解碼。
因為詢問的次數比較多,用scanf或ios::sync_with_stdio(false)能有效加快速度,讀取時先一次性讀兩個資料,還能進一步加快,下面程式碼是隻讀一個的情況。

#include<bits/stdc++.h>
using namespace std;

int main(){

	int t ;
	scanf("%d",&t);
	queue<pair<int,int> > q;
	while(t--){
		int n ;
		cin>>n;
		if(n==1){
			int x,c;
			scanf("%d%d",&x,&c);
			q.push({x,c});
		}
		else if(n==2){
			int c;
			long long ans=0;
			scanf("%d",&c);
			while(c){
				int tmp;
				tmp=min(c,q.front().second);
				ans+=1LL*tmp*q.front().first;
				c-=tmp;
				q.front().second-=tmp;
				if(q.front().second==0)q.pop();
			}
			printf("%lld\n",ans);
		}
	}
	return 0;
}

總結,ABD題目是很好的STL基礎訓練題。