The topic is as follows.
rules
Captain Jack had a good luck and got a lot of gold. But he immediately began to worry, because how to divide the gold coins, has always been a difficult thing, every time Captain Jack has a headache for several days.
With respect to coins, the Pirate's Guild is like this:
- Each action, the captain will be based on the performance of each pirate victory, after the reward, to give you the gold.
- At the time of the spoils, the pirates would stand in a row, and the captain would send a bag of gold to everyone. The number of coins in the bag is small, but the captain guarantees that each pirate will have at least one gold medal.
- After getting the coins, the next two pirates will compare each other. If one of the credits is higher, he must have more gold coins, and if two people score the same, their gold must be the same. Otherwise, the Pirates feel unfair, to riot, and even revolt.
How can we use the least amount of gold to make everyone happy? It's not easy to lead these pirates.
I heard that there was a man in the game who was going to be the king of the Pirates, and Captain Jack believed he could solve the problem.
Enter a description
The Execute.stdin file exists in the current directory of the program, and the program obtains the input data from the Execute.stdin.
N (n<100) decimal positive integers are stored in the Execute.stdin, and the numbers are opened with an empty space.
Each number represents the credit of a pirate, with a value range of (1, 100).
Output Description
Outputs a positive integer that represents the minimum number of gold coins that are satisfactory to all pirates.
Algorithm Ideas
Find out all the local minimums in the sequence, assign a gold coin to the crew in the corresponding position, and then add 1 to the coin on each side.
There is a local maximum between the two local minimum values, such as a sequence ... 11 12 13 14 12 11 ...
, if the two sides of the 11 is the local minimum, 14 is the local maximum, then from left to right, 11 to 13 are assigned 1 2 3 gold coins, from right to left, 11 to 12 are allocated 1 2 gold coins respectively, 14 of the position if the allocation of 3 gold coins can not meet more than 13 of the conditions, so 14 of the position allocated 4 gold coins. Therefore, the local maximum value corresponds to a larger number of gold coins when the local maximum value is incremented from both sides to the local max position.
For the leftmost and most right position of the sequence, if the first number is less than/greater than the second number, then it is the local minimum/large value, and if the last number is less than/greater than the second number, it is a local minimum/large value;
Source
#include <iostream> #include <fstream> #include <vector>using std::vector;// Vector as function parameter and return value notation void money (const vector <int> & value); vector <int> findlocalmin (const vector < Int> & VEC); int main () {/* Opens the file for credit value information */Std::ifstream file; File.Open ("Execute.stdin"); int temp; Vector <int> value; Store credit value if (!file) {std::cout << "error!"; } while (file >> temp) {value.push_back (temp); } file.close (); /* Calculate the number of coins */money (value); Std::cin.get (); return 0;} void money (const vector <int> &value) {//Remove duplicate number int length = Value.size (); Vector <int> NewValue; Newvalue.push_back (Value[0]); for (int i = 1; i < length; ++i) {if (Value[i]! = Value[i-1]) {Newvalue.push_back (value [i]); Extract the number of distinct}}//find local minimum position vector <int> Minlocalpos = findlocalmin (NewValue); Allocate coins (corresponding to non-repeatingsequence) int len = Newvalue.size (); Vector <int> Gold; Place gold coins (corresponding to the original sequence) vector <int> newgold (len, 1); Place gold coins (corresponding to non-repeating sequences) if (Minlocalpos[0] > 0)//start with decrement {for (int k = minlocalpos[0]-1; k >= 0;--k ) {Newgold[k] = newgold[k+1] + 1; On the basis of the latter, add one} for (int i = 1; i < minlocalpos.size (); ++i) {for (int j = Minlocalpos[i -1] + 1; J < Minlocalpos[i]; ++J)//Previous {if (Newvalue[j] > Newvalue[j-1]) {Newgold[j] = newgold[j- 1] + 1; Add one} to the previous (int j = Minlocalpos[i]-1; j > minlocalpos[i-1];--j)//from the back forward {//If the gradient in this direction is greater if ((Newvalue[j] > newvalue[j + 1]) && (newgold[j + 1]+1 > Newgold[j] ) {Newgold[j] = newgold[j + 1] + 1; Add a}}} int end = Minlocalpos[minlocalpos.size ()-1] on the basis of the latter; if (len-1 > End)///end is monotonically increasing {for (int i = end + 1; i < Len; ++i) {newgold[i] = newgold[i-1] + 1; Add one}/*for (int k = 0; k < newgold.size (); ++k) {std::cout << newgold[k] < on the previous basis ;< ""; }*///Allocate coins (corresponding to the original value sequence) int j = 0; int i = 0; while (I < length) {if (value[i] = = Newvalue[j]) {gold.push_back (newgold[j]); ++i; } else {++j; }}//calculate gold and int sum = 0; for (int k = 0; k < gold.size (); ++k) {//std::cout << gold[k] << ""; Sum + = Gold[k]; } std::cout << sum;} Find the local minimum position vector <int> findlocalmin (const vector & VEC) {vector <int> minlocalpos; int len = Vec.size (); if (len = = 1) {minlocalpos.push_back (0); return minlocalpos; }//Len >= 2 if (Vec[0] < vec[1]) {minlocalpos.push_back (0); } for (int i = 1; i < len-1; ++i) {if ((Vec[i] < vec[i-1]) && (Vec[i] < Vec[i + 1]) ) {minlocalpos.push_back (i); }} if (Vec[len-1] < vec[len-2]) {minlocalpos.push_back (len-1); } return Minlocalpos;}
Run results
[C + +] 2017 MediaTek Cup programming challenge game title "Captain Jack's Troubles"