牛客网练习赛33

链接:https://ac.nowcoder.com/acm/contest/308/B
来源:牛客网
 

题目描述

tokitsukaze最近沉迷一款RPG。
这个RPG一天有k分钟,每一天从第1分钟开始。
有n种怪物,第i种怪物每天第一次出现的时间为Xi分钟,第二次出现的时间为2*Xi分钟,第三次出现的时间为3*Xi分钟......同一时刻出现的怪物种类越多,打怪获得的经验也越高。
为了高效练级,tokitsukaze想知道在一天内出现怪物种类最多的时间点会出现多少种怪物,这样的时间点有多少个。

输入描述:

第一行包括2个正整数n,k(1≤n≤10^5,1≤k≤10^6),表示有n种怪物,一天有k分钟。
接下来一行包括n个正整数X(1≤Xi≤10^6),含义如题面所示。

输出描述:

输出一行,包括两个整数a,b。
a表示怪物种类数,b表示时间点的个数。
#include<cstdio>
using namespace std;
int n,k,ans,v[1000007],s,tmp;
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
    scanf("%d",&s),v[s]++;
    for(int i=k;i>=1;i--)
    for(int j=i*2;j<=k;j+=i)
    v[j]+=v[i];
    for(int i=1;i<=k;i++)
    if(ans<v[i])ans=v[i],tmp=1;
    else if(ans==v[i])tmp++;
    printf("%d %d\n",ans,tmp);
}

 链接:https://ac.nowcoder.com/acm/contest/308/C
来源:牛客网
 

题目描述

tokitsukaze又在玩3ds上的小游戏了,现在她遇到了难关。
tokitsukaze得到了一个整数x,并被要求使用x的每一位上的数字重新排列,组成一个能被8整除的数,并且这个数尽可能大。
聪明的你们请帮帮可爱的tokitsukaze,如果无法组成被8整除的数,请输出-1。
保证输入不含前导0,输出也不能含前导0。

输入描述:

第一行包括一个正整数T(T<=1000),表示T组数据。
接下来T行,每一行包括一个整数x,(0≤x≤10^100)。

输出描述:

请输出用这些数字组成出能被8整除的最大的数,如果无法组成出能被8整除的数,请输出-1。
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
 
 
bool flag;
int t[11];
int num[105];
int len;
 
int main()
{
    int T;
    string s;
    cin>>T;
    while(T--)
    {
        flag=false;
        cin>>s;
        len=s.size();
        for(int i=1;i<=len;i++)
            num[i]=s[i-1]-'0';
        if(len==1)
        {
            if(num[1]%8) cout<<-1<<endl;
            else cout<<num[1]<<endl;
        }
        if(len==2)
        {
            int n,m,k1,k2;
            n=num[1]*10+num[2];
            m=num[2]*10+num[1];
            k1=max(n,m),k2=min(n,m);
            if(k1%8==0) cout<<k1<<endl;
            else if(k2%8==0) cout<<k2<<endl;
            else cout<<-1<<endl;
        }
        if(len>=3)
        {
            string ans="",Try;
            int a,b,c;
            bool flag=false;
            fill(t,t+11,0);
            for(int i=1;i<=len;i++)
                t[num[i]]++;
            for(int i=0;i<=999;i+=8)
            {
                a=i%10,b=(i/10)%10,c=i/100;
                t[a]--,t[b]--,t[c]--;
                if(t[a]>=0&&t[b]>=0&&t[c]>=0)
                {
                    Try="";
                    for(int i=9;i>=0;i--)
                        for(int j=1;j<=t[i];j++)
                            Try+=i+'0';
                    flag=true,Try+=c+'0',Try+=b+'0',Try+=a+'0';
                    if(Try>ans) ans=Try;
                }
                t[a]++,t[b]++,t[c]++;
            }
            if(!flag) cout<<-1<<endl;
            else cout<<ans<<endl;
        }
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值