zoukankan      html  css  js  c++  java
  • 普转提——有趣的数,欢乐ABC,打游戏

    有趣的数——构造符合条件的数

    给你一个区间,问有多少个数符合每一位中,只有一个数字和其他数字不同,也就是其他数字都相同,有且只有一个异类;

    数据范围是1e16;

    因为只考虑数量而不用管大小;

    只要0到9枚举出来就好了;

    #include<cstdio>
    #include<map>
    #include<cstring>
    #include<algorithm>
    
    using namespace std;
    typedef long long ll;
    map<ll,int>mp;
    ll l,r;
    int a[20];
    
    int check(int x,int len)
    {
        ll sum=0;
        for(int i=1;i<=len;i++)
        {
            if(a[i]==-1) a[i]=x;
            sum=sum*10+a[i];
        }
        if(sum>=l&&sum<=r) 
        {
            if(!mp[sum]) 
            {
                mp[sum]=1;
                return 1;
            }
            //printf("%d
    ",sum);
            return 0;
        }
        else return 0;
    }
    int ans;
    int main()
    {
        scanf("%lld%lld",&l,&r);
        for(int len=3;len<=17;len++)
        {
            for(int i=0;i<=9;i++)
            {
                for(int j=0;j<=9;j++)//单独的数
                {
                    if(i==j) continue;
                    for(int k=1;k<=len;k++)//单独的数的位置
                    {
                        memset(a,-1,sizeof(a));
                        if(k==1&&j==0) continue;
                        a[k]=j;
                        if(check(i,len)) ans++;
                    }
                }
            }
        }
        printf("%d",ans);
        return 0;
    }

    记得判重,用的map省心;

    欢乐ABC——连续区间找相同的量

    给你一个字符串,一个区间中A,B,C的数量如果相等,这样的区间的个数是多少,区间要连续;

    数据范围1e6;

    用前缀和记录ABC的个数;

    如果a[j]-a[i-1]=b[j]-b[i-1],b[j]-b[i-1]=c[j]-c[i-1],即a[j]-b[j]=a[i-1]-b[i-1],b[j]-c[j]=b[i-1]-c[i-1],这样的区间i到j就是合法的;

    (a[i]-b[i],b[i]-c[i])为一个元素,访问前方有多少相等的元素;

         

    我们还可以再次转化,令A=1e7,B=-999999,C=-1;

    用sum记录前缀和,再sort一遍,求相邻的星通的数;

    因为排序过后,相邻的数如果相等,说明在这两个数之间A+B+C=0;也就是三个字符的数量相等;

    #include<cstdio>
    #include<map>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    const int maxn=1e6+10;
    char s[maxn];
    int a=10000000,b=-9999999,c=-1;
    long long sum[maxn];
    int ans;
    int main()
    {
        scanf("%s",s);
        int len=strlen(s);
        for(int i=0;i<len;i++)
        {
            sum[i+1]=sum[i];
            if(s[i]=='A') sum[i+1]+=a;
            else if(s[i]=='B') sum[i+1]+=b;
            else if(s[i]=='C') sum[i+1]+=c;
        }
        sort(sum,sum+len+1);
        int last=0;
        for(int i=1;i<=len;i++)
        {
            if(sum[i]==sum[i-1])
            {
                ans+=i-last;
            }
            else last=i;
        }
        printf("%d",ans);
        return 0;
    }

    打游戏

    小强又双叒叕一天随手AK的ZROI的J转S模拟赛。AK完了的小强觉得OI太简单了,太没意思了,于是开始打起了更有挑战的游戏。

    小强在游戏里打怪。有一次,他一下子遇到了 n 个怪物。 每个怪物有一个生命值,第 i个怪物的生命值是 hi。而小强除了生命值之外,还有一个属性是魔法值 m。

    小强和怪物们依次行动。每一回合,小强先行动,然后怪物们同时行动。小强每次可以选择以下行动之一:

    • 普通攻击:令某个怪物的生命值减少 1。

    • 重击:消耗 1 魔法值,令某个怪物的生命值减少 2。

    • 群体攻击:消耗 1 魔法值,令全体怪物的生命值减少 1。

    而每个存活的怪物(生命值严格大于 0)每次会令小强的生命值减少 1。假设小强有足够的生命值来维持存活,小强想知道自己至少需要被消耗多少生命值才能击败所有怪物。

    第一行为两个正整数 n 和 m

    第二行为 nn 个正整数,第 i 个数为 hi

  • 相关阅读:
    ELK 一些截图
    AD域
    NPOI
    搭建harbor
    【【【【日常问题记录】】】】
    golang yaml配置文件解析
    golang操作mysql使用总结
    【转】mysql优化步骤
    【转】Mysql事务,并发问题,锁机制
    golang curl
  • 原文地址:https://www.cnblogs.com/WHFF521/p/11523599.html
Copyright © 2011-2022 走看看