ZZULI Oj--1817

1656 단어
1817: match number
Time Limit: 1 Sec  
Memory Limit: 128 MB
Submit: 75  
Solved: 35
Submit Status Web Board
Description
프로그램 쓰기를 좋아하는 학우들은 일반적으로 숫자에 대해 비교적 민감하다.한 줄의 길이가 2*n인 번호는 다음과 같은 조건에 부합되면 일치한다고 생각합니다.
이 번호를 좌우 반으로 나누고 길이는 모두 n입니다.왼쪽 부분의 한 자릿수에 대해 오른쪽 부분에는 한 자릿수가 그것보다 엄격하게 존재한다.또는 왼쪽 부분의 한 자릿수에 대해 오른쪽 부분에는 엄격하게 그것보다 적은 수가 존재한다.오른쪽 부분의 한 분은 왼쪽 부분의 한 분, 즉 한 자릿수당 한 번만 사용할 수 있음을 주의해야 한다.
번호를 주십시오. 당신은 그것이 일치하는지 아닌지를 판단할 수 있습니까?
Input
다중 그룹 데이터.
첫 번째 행, 정수 n (n<100) 1개
두 번째 줄은 길이가 2*n인 번호로'0'~'9'로 구성되어 있습니다.
Output
각 그룹의 데이터에 대해 번호가 일치하면'YES'를 출력하고 그렇지 않으면'NO'를 출력한다(따옴표는 출력하지 않는다).
Sample Input
224212013523754
Sample Output
YES
YES
NO
문제 풀이 사고방식: 아주 간단한 문제로 두 번이나 시간을 초과했다. 판단에 기교 문제가 존재하는 줄 알고 방법을 바꾸어 비교 횟수를 크게 줄였지만 시간을 초과했다.입력 시간이 초과될 줄은 몰랐습니다. 문자열로 직접 입력해야 합니다.다음에 순서를 정한 다음에 하나씩 비교해 보자.
코드는 다음과 같습니다.
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char a[2*1000+10];
char b[1010];
char c[1010];
int main(){
	int n;
	while(scanf("%d",&n)!=EOF){
		scanf("%s",a);
		strcpy(c,a+n);
		strncpy(b,a,n);
		sort(b,b+n);
		sort(c,c+n);
		int flag=1;
		if(b[0]>c[0]){
			for(int i=0;i<n;i++){
				if(b[i]<=c[i]){
					flag=0;
				    break;
				}
				
			}
		}
		else if(b[0]<c[0]){
			for(int i=0;i<n;i++){
				if(b[i]>=c[i]){
						flag=0;
			        	break;
				}
			
			}
		}
		else flag=0;
		
	 if(flag)printf("YES
"); else printf("NO
"); } return 0; }

좋은 웹페이지 즐겨찾기