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基础训练题。

posted @ 2022-04-11 10:29  liuhaijie  阅读(59)  评论(0)    收藏  举报