CF12B Correct Solution?
题目描述(舍弃各种乱七八糟的故事)
给定一个数NN,要求把NN的各个数位打乱,要求组成一个可能的,最小的数(最小数有可能含有前导00)。现在已经有一个“最小数”,请你判断这个“最小数”是不是最小数。
第一行输入n不含前导0。
第二行输入的假定的最小数可能含有前导0。 题目要求排序后的最小数不含前导0。
输入格式
两行。 第一行是给定的数NN。 第二行是假定的NN重组的“最小数”。
输出格式
一行。 如果输入的最小数就是NN重组的最小数,输出“OK”。 否则输出“WRONG_ANSWER”。
Translated by LiM_817
题解:
依题意模拟即可。
代码:
#include<cstdio>
#include<cstring>
using namespace std;
char a1[20],a2[20];
int cnt1[11],cnt2[11];
int ans[20],tot;
int main()
{
// freopen("rhodes.in","r",stdin);
// freopen("rhodes.out","w",stdout);
scanf("%s%s",a1+1,a2+1);
int len1=strlen(a1+1);
int len2=strlen(a2+1);
if(len1!=len2)
{
puts("WRONG_ANSWER");
return 0;
}
if(a1[1]=='0'&&a2[1]=='0')
{
puts("OK");
return 0;
}
if(a2[1]=='0')
{
puts("WRONG_ANSWER");
return 0;
}
for(int i=1;i<=len1;i++)
{
int t1=a1[i]-'0';
int t2=a2[i]-'0';
cnt1[t1]++;
cnt2[t2]++;
}
for(int i=0;i<=9;i++)
if(cnt1[i]!=cnt2[i])
{
puts("WRONG_ANSWER");
return 0;
}
for(int i=1;i<=9;i++)
if(cnt1[i])
{
ans[++tot]=i;
cnt1[i]--;
break;
}
for(int i=1;i<=cnt1[0];i++)
ans[++tot]=0;
for(int i=1;i<=9;i++)
if(cnt1[i])
for(int j=1;j<=cnt1[i];j++)
ans[++tot]=i;
for(int i=1;i<=tot;i++)
if(ans[i]!=(a2[i]-'0'))
{
puts("WRONG_ANSWER");
return 0;
}
puts("OK");
return 0;
}