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]); }