| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
终于ac了代码很水,应该可以看看
#include<iostream>
#include<vector>
#include<cstdlib>
#include<math.h>
#include<time.h>
#include<algorithm>
using namespace std;
void handleTask(int v_index[1000], int width, int weight[1001], int length);
int getValue(int v[1000], int weight[1001], int pos);
class outMap
{
public :
int pos;
int value;
};
int getMaxValue(int v_index[1000], int weight[1001], int width, int pos, bool is_one_raw, int length)
{
int value_1 = 0, value_2 = 0, value_3 = 0, value_4 = 0, value_6 = 0, value_7 = 0, value_8 = 0, value_9 = 0;
int value = getValue(v_index, weight, pos);
int index = 0;
if (is_one_raw)
{
if (pos% width == 0)
{
value_6 = abs(getValue(v_index, weight, pos + 1) - value);
}
else if (pos% width == width - 1)
{
value_4 = abs(getValue(v_index, weight, pos - 1) - value);
}
else
{
value_4 = abs(getValue(v_index, weight, pos - 1) - value);
value_6 = abs(getValue(v_index, weight, pos + 1) - value);
}
}
else if (pos < width)
{
value_8 = abs(getValue(v_index, weight, pos + width) - value);
if (pos < width - 1)
{
value_6 = abs(getValue(v_index, weight, pos + 1) - value);
value_9 = abs(getValue(v_index, weight, pos + width + 1) - value);
}
if (pos > 0)
{
value_4 = abs(getValue(v_index, weight, pos - 1) - value);
value_7 = abs(getValue(v_index, weight, pos + width - 1) - value);
}
}
else if (pos >= weight[length] - width)
{
value_2 = abs(getValue(v_index, weight, pos - width) - value);
if (pos % width < width - 1)
{
value_6 = abs(getValue(v_index, weight, pos + 1) - value);
value_3 = abs(getValue(v_index, weight, pos - width + 1) - value);
}
if (pos % width > 0)
{
value_4 = abs(getValue(v_index, weight, pos - 1) - value);
value_1 = abs(getValue(v_index, weight, pos - width - 1) - value);
}
}
else
{
value_2 = abs(getValue(v_index, weight, pos - width) - value);
value_8 = abs(getValue(v_index, weight, pos + width) - value);
if (pos % width <width - 1)
{
value_6 = abs(getValue(v_index, weight, pos + 1) - value);
value_3 = abs(getValue(v_index, weight, pos - width + 1) - value);
value_9 = abs(getValue(v_index, weight, pos + width + 1) - value);
}
if (pos % width > 0)
{
value_4 = abs(getValue(v_index, weight, pos - 1) - value);
value_1 = abs(getValue(v_index, weight, pos - width - 1) - value);
value_7 = abs(getValue(v_index, weight, pos + width - 1) - value);
}
}
int max_value = value_1;
max_value = max_value > value_2 ? max_value : value_2;
max_value = max_value > value_3 ? max_value : value_3;
max_value = max_value > value_4 ? max_value : value_4;
max_value = max_value > value_6 ? max_value : value_6;
max_value = max_value > value_7 ? max_value : value_7;
max_value = max_value > value_8 ? max_value : value_8;
max_value = max_value > value_9 ? max_value : value_9;
return max_value;
}
int getValue(int v[1000], int weight[1001], int pos)
{
int index = 1;
int value = 0;
while (weight[index] <= pos)
{
index++;
}
return v[index - 1];
}
int compare(const void* l, const void* r)
{
outMap* ll = (outMap*)l;
outMap* rr = (outMap*)r;
return (*ll).pos - (*rr).pos;
}
int main()
{
int width = 0;
while (cin >> width)
{
int v_value[1000];
int weight[1001], length = 0;
if (width == 0)
{
break;
}
int temp_value = 0, temp_size = 0;
long max_length = 0;
weight[0] = max_length;
while (cin >> temp_value >> temp_size)
{
if (temp_value == 0 && temp_size == 0)
{
break;
}
max_length += temp_size;
v_value[length] = temp_value;
weight[length + 1] = max_length;
length++;
}
handleTask(v_value, width, weight, length);
}
cout << 0 << endl;
system("pause");
return 0;
}
void handleTask(int v_index[1000], int width, int weight[1001], int length)
{
outMap returnResult[9001];
int pos = 0;
int index = 0;
bool one_raw = weight[length] <= width;
int last_raw_index = weight[length] - width;
outMap outMap_0;
outMap_0.pos = 0;
outMap_0.value = getMaxValue(v_index, weight, width, 0, one_raw, length);
returnResult[index++] = outMap_0;
for (int i = 0; i <= length; i++)
{
outMap outData_1, outData_2, outData_3, outData_4, outData_6, outData_7, outData_8, outData_9;
int pos = weight[i];
if (pos > 0)
{
outData_4.pos = pos - 1;
outData_4.value = getMaxValue(v_index, weight, width, pos - 1, one_raw, length);
returnResult[index++] = outData_4;
}
if (pos < weight[length] - 1)
{
outData_6.pos = pos + 1;
outData_6.value = getMaxValue(v_index, weight, width, pos + 1, one_raw, length);
returnResult[index++] = outData_6;
}
if (pos > width - 1)
{
outData_2.pos = pos - width;
outData_2.value = getMaxValue(v_index, weight, width, pos - width, one_raw, length);
returnResult[index++] = outData_2;
}
if (pos > width)
{
outData_1.pos = pos - width - 1;
outData_1.value = getMaxValue(v_index, weight, width, pos - width - 1, one_raw, length);
returnResult[index++] = outData_1;
}
if (pos > width + 1 && pos < weight[length] +width - 1)
{
outData_3.pos = pos - width + 1;
outData_3.value = getMaxValue(v_index, weight, width, pos - width + 1, one_raw, length);
returnResult[index++] = outData_3;
}
if (pos < last_raw_index)
{
outData_8.pos = pos + width;
outData_8.value = getMaxValue(v_index, weight, width, pos + width, one_raw, length);
returnResult[index++] = outData_8;
}
if (pos < last_raw_index - 1)
{
outData_7.pos = pos + width - 1;
outData_7.value = getMaxValue(v_index, weight, width, pos + width - 1, one_raw, length);
returnResult[index++] = outData_7;
}
if (pos < last_raw_index - 2)
{
outData_9.pos = pos + width + 1;
outData_9.value = getMaxValue(v_index, weight, width, pos + width + 1, one_raw, length);
returnResult[index++] = outData_9;
}
}
qsort(returnResult, index, sizeof(outMap), compare);
cout << width << endl;
outMap temp = returnResult[0];
for (int i = 1; i < index; i++)
{
if (returnResult[i].value == temp.value)
{
continue;
}
cout << temp.value << " " << returnResult[i].pos - temp.pos << endl;
temp = returnResult[i];
}
cout << temp.value << " " << weight[length]- temp.pos << endl;
cout << "0 0" << endl;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator