Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

为什么我这个代码所有的数据和表打出来的数据是一模一样的,但是交题却是WA?

Posted by philipyexushen at 2015-10-03 21:05:29 on Problem 2718
#include <iostream>
#include <functional>
#include <algorithm>

using namespace std;

static int input[10];
static int length, cutA, cutB;
static int zero_set[6] = { 1, 10, 100, 1000, 10000, 100000 };

int cal(const int, const int);
void cal_odd(const int, const int);

int fcmop(const void *a, const void *b)
{
	return *(int *)a - *(int *)b;
}

int main(void)
{
	int case_sum, tmp;

	scanf("%d", &case_sum);
	getchar();
	for (int i = 0; i < case_sum; i++)
	{
		length = 0;
		while ((tmp = getchar()) != '\n')
		{
			if (tmp != ' ')
				input[length++] = tmp - '0';
		}
		qsort(input, length, sizeof(int), fcmop);
		cutA = length / 2;
		cutA = cutA > length - cutA ? cutA : length - cutA;
		cutB = length - cutA;
		if (length == 0)
			cout << 0 << endl;
		else if (length == 1)
			cout << input[0] << endl;
		else if (length == 2)
			cout << abs(input[1] - input[0]) << endl;
		else
		{
			int min_delta, min_sum;
			if (input[0] != 0)
			{
				if (cutA == cutB)//如果两个子串的长度相同,则取差值最小的相邻数,大的作为n的最高位,小的作为m的最高位,n的剩下位从小的补齐,m从大的补齐
				{
					min_sum = INT_MAX;
					min_delta = input[1] - input[0];
					for (int i = 0; i < length - 1; i++)
					{
						if (input[i + 1] - input[i] < min_delta)
						{
							min_delta = input[i + 1] - input[i];
							min_sum = min(min_sum, cal(i + 1, i));
						}
						else if (input[i + 1] - input[i] == min_delta)
							min_sum = min(min_sum, cal(i + 1, i));
					}
					cout << min_sum << endl;
				}
				else cal_odd(0, length - 1);
			}
			else//input[0]==0;
			{
				if (cutA == cutB)//如果字串长度相同,A-B则A的最高位要比B的最高位的差值要最小且比他大,且要从1开始
				{
					min_sum = INT_MAX;
					min_delta = input[2] - input[1];
					for (int i = 1; i < length - 1; i++)
					{
						if (input[i + 1] - input[i] < min_delta)
						{
							min_delta = input[i + 1] - input[i];
							min_sum = min(min_sum, cal(i + 1, i));
						}
						else if (input[i + 1] - input[i] == min_delta)
							min_sum = min(min_sum, cal(i + 1, i));
					}
					cout << min_sum << endl;
				}
				else cal_odd(1, length - 1);//如果cutA!=cutB,那么直接选一头一尾的最小
			}
		}
	}
	return 0;
}

int cal(const int posAS, const int posBS)
{
	//专门算偶数重复的情况
	int sumA = 0, sumB = 0, lenA = 1, lenB = 1;
	sumA += input[posAS] * zero_set[cutA - lenA];
	sumB += input[posBS] * zero_set[cutB - lenB];
	for (int i = 0; lenA <= cutA; i++)
	{
		if (i != posAS && i != posBS)
		{
			lenA++;
			sumA += input[i] * zero_set[cutA - lenA];
		}	
	}
	for (int i = length - 1; lenB <= cutB; i--)
	{
		if (i != posAS && i != posBS)
		{
			++lenB;
			sumB += input[i] * zero_set[cutB - lenB];
		}
	}
	return sumA - sumB;
}

void cal_odd(const int posAS, const int posBS)
{
	int lenA = 1, lenB = 1, sumA = 0, sumB = 0;
	sumA += input[posAS] * zero_set[cutA - lenA];
	sumB += input[posBS] * zero_set[cutB - lenB];
	for (int i = 0; lenA <= cutA; i++)
	{
		if (i != posAS && i != posBS)
		{
			++lenA;
			sumA += input[i] * zero_set[cutA - lenA];
		}
	}
	for (int i = length - 2; lenB <= cutB; i--)
	{
		if (i != posAS && i != posBS)
		{
			++lenB;
			sumB += input[i] * zero_set[cutB - lenB];
		}
	}
	cout << sumA - sumB << endl;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator