夢追い人

"It takes a dreamer to make a dream come true."―Vincent Willem van Gogh

0506,0513

0506

問題文は各自

方針

やるだけ

コード
#include <iostream>
#include <sstream>
#include <algorithm>
#include <string>
using namespace std;

int main() {
	int n;
	string s;
	while (cin >> n && n != 0) {
		cin >> s;
		for (int i=0; i<n; i++) {
			int x=0;
			char ch = s[0];
			string tmp="";
			for (int j=0; j<s.length(); j++) {
				if (ch == s[j]) {
					x++;
				} else {
					stringstream ss; ss<<x;
					string cnt=ss.str();
					tmp+=cnt;
					tmp.push_back(ch);
					ch = s[j];
					x = 1;
				}
			}
			stringstream ss; ss<<x;
			string cnt=ss.str();
			tmp+=cnt;
			tmp.push_back(ch);
			s=tmp;
		}
		cout << s << endl;
	}
}

0513

カードをシャッフルする。もしk=0ならばそのときは山を半分にわけて交互に入れていく。それ以外の時はk枚目までを最初の山とし、後の山と順番を入れ替える。最終的な山の状態を答えよ。

方針

難しいロジックは何も必要ないので正しいシャッフルになるように慎重にコードを書くだけ。

コード
#include <cstdio>
#include <vector>
using namespace std;
#define PB push_back

int main() {
	int n; scanf("%d",&n);
	vector<int> deck(2*n), tmp1(n), tmp2(n);
	for (int i=0; i<2*n; i++) deck[i] = i+1;
	int m; scanf("%d",&m);
	for (int c=0; c<m; c++) {
		int k; scanf("%d",&k);
		if (k != 0) {
			vector<int> back, before;
			for (int l=0; l<k; l++) before.PB(deck[l]);
			for (int l=k; l<2*n; l++) back.PB(deck[l]);
			for (int i=0; i<back.size(); i++) deck[i] = back[i];
			for (int i=0; i<before.size(); i++) deck[i+back.size()] = before[i];
		} else {
			vector<int> before, back;
			for (int i=0; i<n; i++) before.PB(deck[i]);
			for (int i=n; i<2*n; i++) back.PB(deck[i]);
			for (int i=0; i<2*n; i+=2) deck[i]=before[i/2];
			for (int i=1; i<2*n; i+=2) deck[i]=back[(int)(i/2)];
		}
	}
	for (int i=0; i<2*n; i++) printf("%d\n",deck[i]);
}