普转提——有趣的数,欢乐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

原文地址:https://www.cnblogs.com/WHFF521/p/11523599.html