POJ 2718:Smallest Difference(dfs)

원본 주소: 클릭 하여 링크 열기
(원 제 는 영어 이 고 다음은 번역 이 있 는 것)
묘사 하 다.
많은 서로 다른 소수 자릿수 를 감안 하여, 너 는 비어 있 지 않 은 부분 집합 을 선택 하여 하나의 정수 자릿수 를 형성 하고 질 서 를 쓸 수 있다.나머지 숫자 는 일부 질서 에서 두 번 째 정 수 를 형성 하 는 데 쓸 수 있다.얻 은 정수 가 0 이 아니라면 정 수 는 숫자 0 에서 시작 되 지 않 을 것 이다.
예 를 들 어 숫자 0, 1, 2, 4, 6, 7 이 있다 면 두 개의 정수 10 과 2467 을 작성 할 수 있 습 니 다.물론 이런 쌍 정 수 를 형성 할 수 있 는 방법 은 210 년 과 764 년, 204 년 과 176 년 등 이 많다.정수 간 의 차이의 절대 치 는 지난 28 세 에 위의 규칙 으로 더 작은 차 이 를 실현 할 수 있 는 다른 한 쌍 이 없다 는 사실 이 증명 되 었 다.
(제목 은 몇 개의 숫자 (0 에서 9 까지 중복 되 지 않 음) 를 주 고 이 몇 개의 숫자 로 두 개의 수 를 구성 하여 그들의 절대 치 를 최소 화 하 는 것 이다.
예 를 들 어 0, 1, 2, 4, 6, 7 을 주면 204 와 176 의 차이 가 가장 적 고 28 이 며 276, 140 을 구성 하면 가장 작은 것 이 아니다)
 
입력
입력 한 첫 줄 에는 병례 가 포함 되 어 있 습 니 다.모든 사례 에 대해 한 줄 의 입력 은 최소 두 개 를 포함 하지만 10 개의 소수 자릿수 를 초과 하지 않 는 다.(소수 자리 0, 1,... 9).한 줄 에 만 나타 나 는 숫자 가 없습니다.숫자 는 추가 주문 에 나타 나 빈 칸 으로 격 리 됩 니 다.
출력
모든 테스트 용례 에 대해 한 줄 에 두 개의 정수 에 쓰 는 최소 절대 차 이 는 주어진 숫자 에서 위 에서 설명 한 규칙 과 같이 쓸 수 있다.
 
시간 제한: 1000 ms
메모리 제한: 65536 k
Sample Input
1
0 1 2 4 6 7 Sample Out
28
 
#include <iostream>
#include <algorithm>
#include <cctype>
#include <cstdio>
#define MAX_N 10

using namespace std; 

int a[MAX_N], n, ans;

int ArrayNum(int l, int r)
{
	int num = 0;
	for(int i = l; i < r; i ++)
		num = num*10 + a[i];
	return num;
}

void solve()
{
	ans = 1E10;
	do{
		int m = n / 2;
		if(!a[0] && m > 1)
			continue;
		if(!a[m] && n - m > 1)
			continue;
			
		 ans = min(ans, abs(ArrayNum(0, m) - ArrayNum(m, n)));
	}while(next_permutation(a, a + n));
	cout << ans << endl;
}

int main()
{
	int M;
	cin >> M;
	getchar();	//  '
' while(M --){ char ch; n = 0; while((ch = getchar()) != EOF){ if('
' == ch) break; else if(isdigit(ch)) a[n ++] = ch - '0'; } solve(); } return 0; }

Dfs 폭력 추가, 최대 10! =362 8800 번 으로 충분 합 니 다.
이 문 제 는 입력 한 첫 줄 이 숫자 개수 인 줄 알 았 는데 WA 가 여러 번 나 왔 다.

좋은 웹페이지 즐겨찾기