编码问题题解

Go CSP-S!  •  5年前


#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string>
#include<queue>
#include<stack>
#include <math.h>
#include <string.h>
#define ll long long
#define inf 0x3f3f3f3f3f
#define N 1000005
char a[N];
int a1[N],b[N];
int vis[N];
ll cut;
using namespace std;
int main()
{
int n;
cin>>n;
int k=0;//简单的输入格式;
memset(vis,0,sizeof(vis));
char s;
getchar();
scanf("%c%s",&s,a);
if(s=='A')
{
for(int i=0; i<strlen(a); i++)
{

if(a[i]>='0'&&a[i]<='9')
{
a1[k++]=a[i]-'0';
}
}
for(int i=0; i<k; i++)//k个数
{
for(int j=0; j<i; j++)//j小于i,每次都是当前与它前面的数的比较
{
if(a1[i]>a1[j])//这个数a1[i]比前面的一个数大时
{
b[i]++;
}
}
}
cout<<"B=(";
for(int i=0; i<k; i++)
{
if(i<k-1)
cout<<b[i]<<",";
else if(i==k-1)
cout<<b[i]<<")";
}
}
else if(s=='B')
{
for(int i=0; i<strlen(a); i++)//之前用字符输入,所以都换成数字;
{
if(a[i]>='0'&&a[i]<='9')
{
a1[k++]=a[i]-'0';
}
}
int ss;
for(int i=k-1; i>=0; i--)从后往前
{
ss=0;//初始化
for(int j=0; j<k; j++)//代表k个
{
if(ss==a1[i]&&!vis[j])//当ss等于a1[i],标记后面也没有出现过;
{
b[i]=j;//存入这个数
vis[j]=1;
break;
}
if(!vis[j])//如果出现了
{
ss++;
}
}
}
cout<<"A=(";
for(int i=0; i<k; i++)
{
if(i<k-1)
cout<<b[i]<<",";
else if(i==k-1)
cout<<b[i]<<")";
}
}
return 0;
}

 

数据小,暴力即可。开两个数组,一个存入输入数据,另一个存入输出的数据;

对于①:
要从前往后找,一旦这个数比前面的一个数大,b数组下标为这个数的的值++,直到找完;

对于② :我们要从后面找,一旦s等于a1[i]并后面也没有出现过,说明这个数满足;


评论:

请先登录,才能进行评论