atcoder abc244

A

最后一个字符

#include
using namespace std;
int main(){
	char ch;
	while(cin>>ch);
	cout<<ch;
}

B

方向的运用

#include
using namespace std;
string xx;
int n,fangxiang,x,y;//方向1南,2西,3北,4东
int main() {
	cin >> n >> xx;
	for (int i=0;i<xx.length();i++) {
		if (xx[i] == 'S') {
			if(fangxiang%4==0)x++;
			if(fangxiang%4==1)y--;
			if(fangxiang%4==2)x--;
			if(fangxiang%4==3)y++;
		}
		else fangxiang++;
	}
	cout<<x<<" "<<y;
}

C

这就是传说中的交互题吗?
输出一个没有输入过也没有输出过且小于等于2n+1的数字。
把它输入的标记上咱不输出,输出下一个最小的没输出过的数,自己输出过的可以标记也可以不标。因为不会重复访问,输出的结果是单调递增的。

#include
using namespace std;
int stdcin,num[2005],zz=1;
int main() {
	cin>>stdcin;
	cout<<1<<endl;num[1]=1;//我先出
	while(cin>>stdcin&&stdcin){
		num[stdcin]=1;
		while(num[++zz]);//找到下一个没出过的数
		cout<<zz<<endl;
	}
}

n有什么用处啊?我这个不会超的,都是按顺序出的。

D

模拟一下,只要是偶数次,多少次都是一样的。直接模拟一下两次是否能变成即可。

#include 
#include 
using namespace std;
bool sign(string S){
	return S == "R G B" || S == "G B R" || S == "B R G";
}
int main(){
	string S, T;
	getline(cin, S);getline(cin, T);
	if(sign(S) == sign(T)) cout << "Yes";
	else cout << "No";
}

E

看代码里的注释

#include
using namespace std;
typedef long long ll;
const int mod = 998244353;
ll dp[2010][2010][2],N,M,K,S,T,X;;
pair<int, int> v[2010];
int main() {
	//	数列里面要有k+1个点,全部从1-n里面拿
	//	要满足起点是s,终点是t,并且A[i]要和A[i+1]相连,x出现偶数次
	//	dp[i][j][k]表示第i个点,序列中第j个位置,x出现的奇数还是偶数次
	cin>>N>>M>>K>>S>>T>>X;
	for(ll i=1;i<=M;i++)cin>>v[i].first>>v[i].second;
	dp[S][0][0]=1;
	for(ll i=0;i<K;i++)
		for(ll j=1;j<=M;j++){
			ll x = v[j].first, y=v[j].second;
			for(ll k=0;k<=1;k++){
				//奇数和偶数的转换
				(dp[x][i+1][k] += dp[y][i][k ^ (X==y)]) %= mod;
				(dp[y][i+1][k] += dp[x][i][k ^ (X==x)]) %= mod;
			}
		}
	cout<<dp[T][K][0];
}

你可能感兴趣的:(c++,atcoder,abc,动态规划,c++)