![zzuli 1817: match number 模拟 zzuli 1817: match number 模拟](https://image.shishitao.com:8440/aHR0cHM6Ly9ia3FzaW1nLmlrYWZhbi5jb20vdXBsb2FkL2NoYXRncHQtcy5wbmc%2FIQ%3D%3D.png?!?w=700&webp=1)
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
2421
2
0135
2
3754
Sample Output
YES
YES
NO
代码:
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;
}