JOI2007予選 問題4@C++(-18)
カードの状態を配列に記憶して、操作ごとに全部のカードを動かすアルゴリズムでもできるけど、今回は操作を配列に記憶して、カードごとに全部の操作を行うイメージのアルゴリズムにしてみた。時間計算量は変わらないし、配列一個で済む分こちらの方がシンプルだと思う。(ただしカードの上限は200枚、操作の上限は1000回なので、メモリ的にはこの方が食うが、誤差の範囲。)
#include <cstdio> #include <algorithm> #include <vector> using namespace std; int main(int argc,char* argv[]) { int n,m; scanf("%d\n",&n); scanf("%d\n",&m); vector<int> procs(m); for(int i=0;i<m;i++) { scanf("%d\n",&procs[i]); } for(int i=0;i<n<<1;i++) { int a=i; for(vector<int>::reverse_iterator j=procs.rbegin();j!=procs.rend();j++) { if(*j) { a=(a+*j)%(n<<1); } else { a=(a>>1)+(a&1)*n; } } printf("%d\n",a+1); } return 0; }