zoukankan      html  css  js  c++  java
  • topcoder srm 550

    div1 250pt:

      题意:有个机器人,从某一点出发,他只有碰到地形边缘或者碰到走过的点时才会改变运动方向,然后接着走,现在给出他的运动轨迹,判断他的运动是否合法,如果合法的话,那么整个地形的最小面积是多少。

      解法:先随便设定一个起点,然后模拟机器人走的路线,先确定出来运动的大致范围,然后判断运动轨迹是否合法,也就是出了最后一步可以手动终止之外,看其他的时候,它转变方向是不是合法。。。。

      1 // BEGIN CUT HERE
      2 
      3 // END CUT HERE
      4 #line 5 "RotatingBot.cpp"
      5 #include<cstdio>
      6 #include<sstream>
      7 #include<cstring>
      8 #include<cstdlib>
      9 #include<ctime>
     10 #include<cmath>
     11 #include<cassert>
     12 #include<iostream>
     13 #include<string>
     14 #include<vector>
     15 #include<map>
     16 #include<set>
     17 #include<queue>
     18 #include<stack>
     19 #include<algorithm>
     20 using namespace std;
     21 typedef long long ll;
     22 typedef pair<int,int> pii;
     23 int vis[1000][1000];
     24 int dir[4][2] = {1,0,0,1,-1,0,0,-1};
     25 class RotatingBot
     26 {
     27     public:
     28     int minArea(vector <int> moves){
     29     //$CARETPOSITION$
     30         memset(vis,-1,sizeof(vis));
     31         int cur_d = 0;
     32         int cur_x = 500,cur_y = 500;
     33         vis[cur_x][cur_y] = 0;
     34         for(int i = 0;i < moves.size();i++){
     35             int len = moves[i];
     36             while(len > 0){
     37                 cur_x += dir[cur_d][0];
     38                 cur_y += dir[cur_d][1];
     39                 if(vis[cur_x][cur_y] != -1)return -1;
     40                 vis[cur_x][cur_y] = i;
     41                 len --;
     42             }
     43             cur_d = (cur_d + 1) % 4;
     44         }
     45      //   cout << "done" <<endl;
     46         int left = 999,right = 0,top = 0,bottom = 999;
     47         for(int i = 0;i < 1000;i++)
     48             for(int j = 0;j < 1000;j++){
     49                 if(vis[i][j] != -1){
     50                     left = min(left,i);
     51                     right = max(right,i);
     52                     top = max(top,j);
     53                     bottom = min(bottom,j);
     54                 }
     55             }
     56     //    cout <<"left: "<<left<<" right: "<<right <<" top: "<<top<<" bottom:"<<bottom<<endl;
     57         cur_x = 500,cur_y = 500;cur_d = 0;
     58         for(int i = 0;i < moves.size();i++){
     59             int len = moves[i];
     60             while(len > 0){
     61                 cur_x += dir[cur_d][0];
     62                 cur_y += dir[cur_d][1];
     63                 len --;
     64             }
     65             if(i == moves.size() - 1)continue;
     66             int next_x = cur_x + dir[cur_d][0];
     67             int next_y = cur_y + dir[cur_d][1];
     68             if(next_x >= left && next_x <= right && next_y >= bottom && next_y <= top){
     69                 if(vis[next_x][next_y] == -1)return -1;
     70                 if(vis[next_x][next_y] > i)return -1;
     71             }
     72             cur_d = (cur_d + 1) % 4;
     73         }
     74         return (right - left + 1) * (top - bottom + 1);
     75 
     76     }
     77 
     78 // BEGIN CUT HERE
     79     public:
     80     void run_test(int Case) { if ((Case == -1) || (Case == 0)) test_case_0(); if ((Case == -1) || (Case == 1)) test_case_1(); if ((Case == -1) || (Case == 2)) test_case_2(); if ((Case == -1) || (Case == 3)) test_case_3(); if ((Case == -1) || (Case == 4)) test_case_4(); if ((Case == -1) || (Case == 5)) test_case_5(); if ((Case == -1) || (Case == 6)) test_case_6(); if ((Case == -1) || (Case == 7)) test_case_7(); }
     81     private:
     82     template <typename T> string print_array(const vector<T> &V) { ostringstream os; os << "{ "; for (typename vector<T>::const_iterator iter = V.begin(); iter != V.end(); ++iter) os << '"' << *iter << "","; os << " }"; return os.str(); }
     83     void verify_case(int Case, const int &Expected, const int &Received) { cerr << "Test Case #" << Case << "..."; if (Expected == Received) cerr << "PASSED" << endl; else { cerr << "FAILED" << endl; cerr << "	Expected: "" << Expected << '"' << endl; cerr << "	Received: "" << Received << '"' << endl; } }
     84     void test_case_0() { int Arr0[] = {15}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arg1 = 16; verify_case(0, Arg1, minArea(Arg0)); }
     85     void test_case_1() { int Arr0[] = {3,10}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arg1 = 44; verify_case(1, Arg1, minArea(Arg0)); }
     86     void test_case_2() { int Arr0[] = {1,1,1,1}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arg1 = -1; verify_case(2, Arg1, minArea(Arg0)); }
     87     void test_case_3() { int Arr0[] = {9,5,11,10,11,4,10}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arg1 = 132; verify_case(3, Arg1, minArea(Arg0)); }
     88     void test_case_4() { int Arr0[] = {12,1,27,14,27,12,26,11,25,10,24,9,23,8,22,7,21,6,20,5,19,4,18,3,17,2,16,1,15}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arg1 = 420; verify_case(4, Arg1, minArea(Arg0)); }
     89     void test_case_5() { int Arr0[] = {8,6,6,1}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arg1 = -1; verify_case(5, Arg1, minArea(Arg0)); }
     90     void test_case_6() { int Arr0[] = {8,6,6}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arg1 = 63; verify_case(6, Arg1, minArea(Arg0)); }
     91     void test_case_7() { int Arr0[] = {5,4,5,3,3}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arg1 = 30; verify_case(7, Arg1, minArea(Arg0)); }
     92 
     93 // END CUT HERE
     94 
     95 };
     96 // BEGIN CUT HERE
     97 int main(){
     98     RotatingBot ___test;
     99     ___test.run_test(-1);
    100     return 0;
    101 }
    102 // END CUT HERE
    250pt

    div1 500pt:

      题意:两个人在一个无限大的格子里涂色,第一个人先在(0,0)涂色,然后接下来的每一轮,对于所有的点(x,y),如果(x-1,y-1)和(x-2,y)中有且只有一个点被涂色了,那么就把这个点也涂了,问经过t轮之后,某个区域的染色情况。

      解法:先在纸上模拟一下前几轮的情况,我们很容易发现,被涂色的区域就是{x>=0,y>=0并且x<=y}这部分区域,而且被涂色点的分布很像一个杨辉三角,其中被涂色的部分就是杨辉三角中奇数的点。。。于是问题就变成判断C(n,m)奇偶性的问题了,有个结论C(n,m)是奇数当且仅当n&m==n。。。

     1 // BEGIN CUT HERE
     2 
     3 // END CUT HERE
     4 #line 5 "CheckerExpansion.cpp"
     5 #include<cstdio>
     6 #include<sstream>
     7 #include<cstring>
     8 #include<cstdlib>
     9 #include<ctime>
    10 #include<cmath>
    11 #include<cassert>
    12 #include<iostream>
    13 #include<string>
    14 #include<vector>
    15 #include<map>
    16 #include<set>
    17 #include<queue>
    18 #include<stack>
    19 #include<algorithm>
    20 using namespace std;
    21 typedef long long ll;
    22 typedef pair<int,int> pii;
    23 class CheckerExpansion
    24 {
    25     public:
    26     vector <string> resultAfter(long long t, long long x0, long long y0, int w, int h){
    27     //$CARETPOSITION$
    28         vector<string> ret;
    29       //  t = 5;x0 = 0;y0 = 0;w = 10;h = 10;
    30         for(int i = 0;i < h;i++){
    31             string tmp = "";
    32             for(int j = 0;j < w;j++){
    33                 char will;
    34                 long long x = x0 + j;
    35                 long long y = y0 + h - i - 1;
    36         //        if(x == y)cout <<"x : " <<x<<" y:"<<y<<endl;
    37                 if((x + y) % 2 == 0){
    38                     if(x < y){
    39                         will = '.';
    40                     }else{
    41                         long long row = (x + y) / 2;
    42                         long long column = abs(x - row);
    43                         if(row + 1> t){
    44                             will = '.';
    45                         }else if((row & column) == column){
    46                             if(row % 2 == 0){
    47                                 will = 'A';
    48                             }else{
    49                                 will = 'B';
    50                             }
    51                         }else{
    52                             will = '.';
    53                         }
    54                     }
    55                 }else{
    56                     will = '.';
    57                 }
    58         //        if(x == y)cout<<will<<endl;
    59                 tmp += will;
    60             }
    61             ret.push_back(tmp);
    62         //    cout << tmp << endl;
    63 
    64         }
    65         return ret;
    66 
    67 
    68     }
    69 
    70 // BEGIN CUT HERE
    71     public:
    72     void run_test(int Case) { if ((Case == -1) || (Case == 0)) test_case_0(); if ((Case == -1) || (Case == 1)) test_case_1(); if ((Case == -1) || (Case == 2)) test_case_2(); if ((Case == -1) || (Case == 3)) test_case_3(); }
    73     private:
    74     template <typename T> string print_array(const vector<T> &V) { ostringstream os; os << "{ "; for (typename vector<T>::const_iterator iter = V.begin(); iter != V.end(); ++iter) os << '"' << *iter << "","; os << " }"; return os.str(); }
    75     void verify_case(int Case, const vector <string> &Expected, const vector <string> &Received) { cerr << "Test Case #" << Case << "..."; if (Expected == Received) cerr << "PASSED" << endl; else { cerr << "FAILED" << endl; cerr << "	Expected: " << print_array(Expected) << endl; cerr << "	Received: " << print_array(Received) << endl; } }
    76     void test_case_0() { long long Arg0 = 1LL; long long Arg1 = 0LL; long long Arg2 = 0LL; int Arg3 = 4; int Arg4 = 4; string Arr5[] = {"....", "....", "....", "A..." }; vector <string> Arg5(Arr5, Arr5 + (sizeof(Arr5) / sizeof(Arr5[0]))); verify_case(0, Arg5, resultAfter(Arg0, Arg1, Arg2, Arg3, Arg4)); }
    77     void test_case_1() { long long Arg0 = 5LL; long long Arg1 = 4LL; long long Arg2 = 1LL; int Arg3 = 3; int Arg4 = 4; string Arr5[] = {"A..", "...", "B..", ".B." }; vector <string> Arg5(Arr5, Arr5 + (sizeof(Arr5) / sizeof(Arr5[0]))); verify_case(1, Arg5, resultAfter(Arg0, Arg1, Arg2, Arg3, Arg4)); }
    78     void test_case_2() { long long Arg0 = 1024LL; long long Arg1 = 1525LL; long long Arg2 = 512LL; int Arg3 = 20; int Arg4 = 2; string Arr5[] = {"B...B...B...........", ".B.A.B.A.B.........." }; vector <string> Arg5(Arr5, Arr5 + (sizeof(Arr5) / sizeof(Arr5[0]))); verify_case(2, Arg5, resultAfter(Arg0, Arg1, Arg2, Arg3, Arg4)); }
    79     void test_case_3() { long long Arg0 = 53LL; long long Arg1 = 85LL; long long Arg2 = 6LL; int Arg3 = 5; int Arg4 = 14; string Arr5[] = {".....", ".....", "B....", ".B.A.", ".....", ".....", ".....", ".....", ".....", ".....", "B....", ".B...", "..B..", ".A.B." }; vector <string> Arg5(Arr5, Arr5 + (sizeof(Arr5) / sizeof(Arr5[0]))); verify_case(3, Arg5, resultAfter(Arg0, Arg1, Arg2, Arg3, Arg4)); }
    80 
    81 // END CUT HERE
    82 
    83 };
    84 // BEGIN CUT HERE
    85 int main(){
    86     CheckerExpansion ___test;
    87     ___test.run_test(-1);
    88     return 0;
    89 }
    90 // END CUT HERE
    500pt
  • 相关阅读:
    云级Keyvalue数据库大比较
    如何诊断ORA125XX连接问题
    Oracle Internal Event:10235 Heap Checking诊断事件
    Oracle Database 11g R2 在Oracle Linux 6上获得认证
    一张图帮你搞懂oracle UGA User Global Area的概念
    Oracle Buffer Cache Chain图解
    ORA04036: 实例使用的 PGA 内存超出 PGA_AGGREGATE_LIMIT
    如何诊断ASMLIB故障
    Oracle RDBMS Server 11gR2 Preinstall RPM For Oracle Linux 6
    图解Oracle Buffer Cache LRU List
  • 原文地址:https://www.cnblogs.com/silver-bullet/p/3582557.html
Copyright © 2011-2022 走看看