Topcoder SRM 709 DIV 2 250pt Robofactory solution

来源:互联网 发布:sql serve 编辑:程序博客网 时间:2024/05/01 09:20

Problem Statement

    

Hero owns a factory. There are n robots working at the factory. The robots are numbered 0 through n-1.

Today, exactly one of the robots became corrupted. Hero has decided to give all robots a test that may determine the number of the corrupted robot. The test works as follows: For each x from 0 to n-1, in order, Hero tells robot x a positive integer and the robot answers whether the integer is odd or even. Each normal robot will always give the correct answer. The corrupted robot may sometimes give the opposite answer. More precisely: the corrupted robot will answer incorrectly if and only if the previous robot was given an odd number. In particular, if robot 0 is the corrupted robot, it will give the correct answer (as there is no previous robot).

You are given a log of the test: a vector <int> query and a vector <string> answer, each with n elements. For each x, query[x] is the positive integer given to robot x, and answer[x] is the answer given by the robot: either "Odd" or "Even".

It is guaranteed that the situation described by query and answer could have occurred as described above. If it is possible to determine the index of the corrupted robot, return it. Otherwise, return -1.

Definition

    

Class:

Robofactory

Method:

reveal

Parameters:

vector <int>, vector <string>

Returns:

int

Method signature:

int reveal(vector <int> query, vector <string> answer)

(be sure your method is public)

Limits

    

Time limit (s):

2.000

Memory limit (MB):

256

Stack limit (MB):

256

Constraints

-

n will be between 1 and 50, inclusive.

-

query and answer will contain exactly n elements.

-

Each element in query will be between 1 and 1000, inclusive.

-

Each element in answer will be either "Odd" or "Even".

-

It is guaranteed that there will be at least one possible number of the corrupted robot.

Examples

0)

 

    

{3,2,2}
{"Odd", "Odd", "Even"}
Returns: 1

Robot 1 gave the wrong answer. Thus, robot 1 is the corrupted robot.

1)

 

    

{1,3,5,10}
{"Odd", "Odd", "Odd", "Even"}
Returns: 0

All robots gave correct answers. Still, we can deduce that the corrupted robot must be robot 0. For example, robot 1 cannot be the corrupted robot: as robot 0's number was odd, robot 1 would have answered incorrectly if it were corrupted.

2)

 

    

{2,3,5,10}
{"Even", "Odd", "Odd", "Even"}
Returns: -1

Again, all robots gave correct answers. This time we cannot be sure which robot is corrupted. All we know is that it is either robot 0 or robot 1. Both possibilities are consistent with the given input data. Thus, we should return -1.

3)

 

    

{2,4,6,10}
{"Even", "Even", "Even", "Even"}
Returns: -1

4)

 

    

{107}
{"Odd"}
Returns: 0

5)

 

    

{1,1,1}
{"Odd", "Odd", "Even"}
Returns: 2

This problem statement is the exclusive and proprietary property of TopCoder, Inc. Any unauthorized use or reproduction of this information without the prior written consent of TopCoder, Inc. is strictly prohibited. (c)2003, TopCoder, Inc. All rights reserved.



Solution:

  The key of this problem is to remember that there's exactly one corrupted robot. We could assume that robot#0 is not at first, and then search the next n - 1 robots. Once we find a robot that does not satisfy "the corrupted robot will answer incorrectly if and only if the previous robot was given an odd number", it's the corrupted robot. When we are searching throw robot #1 to robot #n - 1, we record the number of robots whose previous robot number is even because we cannot judge if the robot is the corrupted one.

  Finally, if we have more than 0 robots undecided with 0 robots that are corrupted, print "-1" because we don't know which one is corrupted between robot #0 and robots undecided.

if we have 0 robots undecided remained, print "0" because we know there's one robot that is corrupted and it must be robot #0.


Code:

#include <bits/stdc++.h>using namespace std;int a[1002];map <string, int> m;class Robofactory{  public:    int reveal(vector<int> query, vector <string> answer){     m["Odd"] = 1, m["Even"] = 0;     int different = 0, wrong = -1;     a[0] = query[0] % 2;        //if(a[0] == m[answer[0]]) wrong++; else different++;     for(int i = 1; i < query.size(); i++){     a[i] = query[i] % 2;     if(a[i - 1] == 0) different++;     if(m[answer[i]] != a[i]){     if(a[i - 1] == 1) wrong = i;     }     }     if(wrong != -1) {     return wrong;     }     else{       if(different == 0) return 0;       else return (-1);     }    }};


1 0
原创粉丝点击