【NOIP 模拟赛2018 】number

一、题目
【NOIP 模拟赛2018 】number_第1张图片

二、分析

先样例分析一下:小于30的数对有:(1,11),(2,22),(12,21)。
再看一下数据,于是就发现了10的7次方不能暴力,然后看了一下题解想了一下,原来可以用二进制表示构成该数的各位数,也就是用0来或运算,然后碰到一样的就更新答案。

三、代码

#include 
using namespace std;
char a[100005];
int b[100005],ans[100005];
int tot=1;
int main(){
    gets(a);
    int len = strlen(a);
    for(int i=1;i<=len;i++) b[i]=a[i-1]-'0';
    ans[1]=b[1];
    for(int i=2;i<=len;i++){
        if(b[i]>=ans[tot]) ans[++tot] = b[i];
        else{
            int t = b[i];
            int temp = upper_bound(ans+1,ans+1+tot,t)-ans;
            ans[temp]= b[i];
        }
    }
    cout<return 0;
}

你可能感兴趣的:(【NOIP 模拟赛2018 】number)