zzuli 1817: match number 模拟

1817: match number

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 199  Solved: 72

SubmitStatusWeb Board

Description

喜欢写程序的同学一般对数字较为敏感。对于一串长度为2*n的号码,我们认为如果它符合以下条件,就是匹配的:

把这个号码分为左右两半部分,长度均为n。对于左半部分的每一位数,右半部分都存在一位严格大于它的数;或者对于左半部分的每一位数,右半部分都存在一位严格小于它的数。注意,右半部分的每一位必须对应左半部分的某一位,也就是每一位数只能“使用”一次。

给出一个号码,你能判断它是否是匹配的吗?

Input

多组数据。

第一行,1个整数n(n<1000)。

第二行,一串长度为2*n的号码,由'0'~'9'组成。

Output

对于每组数据,如果号码是匹配的,输出"YES",否则输出"NO"(引号不输出)。

Sample Input

2
2421
2
0135
2
3754

Sample Output

YES
YES
NO

代码:
#include<iostream>
#include<string>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=20005;
char s[maxn];
int ans[maxn],bns[maxn];
int n;
bool slove1() {
    bool flag=true;
    for(int i=0;i<n;++i) {
        if(ans[i]>=bns[i]) {
            flag=false;
            break;
        }
    }
    return flag;
}
bool slove2() {
    bool flag=true;
    for(int i=0;i<n;++i) {
        if(ans[i]<=bns[i]) {
            flag=false;
            break;
        }
    }
    return flag;
}
int main() {
    while(~scanf("%d",&n)) {
        scanf("%s",s);
        for(int i=0;i<n;++i) {
            ans[i]=s[i]-'0';
            bns[i]=s[i+n]-'0';
        }
        sort(ans,ans+n);
        sort(bns,bns+n);
        if(slove1()||slove2()) {
            printf("YES\n");
        } else {
            printf("NO\n");
        }
    }
    return 0;
}


posted @ 2017-11-03 01:43  lemonsbiscuit  阅读(118)  评论(0编辑  收藏  举报