• 牛客练习赛33


    A.tokitsukaze and Counting

    题目描述

    给出3个整数L,R,x。tokitsukaze想知道,闭区间[L,R]中,x的倍数出现了几次。

    输入描述:

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

    输出描述:

    输出T行,每一行一个整数,表示答案。
    示例1

    输入

    1
    2 5 3

    输出

    1
    解题思路:水!
    AC代码:
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long LL;
     4 LL T,L,R,x;
     5 int main(){
     6     while(cin>>T){
     7         while(T--){
     8             cin>>L>>R>>x;
     9             cout<<R/x-(L-1)/x<<endl;
    10         }
    11     }
    12     return 0;
    13 }

    B.tokitsukaze and RPG

    题目描述

    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表示时间点的个数。
    示例1

    输入

    3 6
    2 2 3
    

    输出

    3 1
    

    说明

    在第6分钟时,3种怪物都出现了。
    示例2

    输入

    3 5
    2 2 3
    

    输出

    2 2
    

    说明

    在第2分钟和第4分钟时,第一种和第二种怪物出现了。
    示例3

    输入

    6 10
    1 2 3 4 5 6
    

    输出

    4 1
    

    说明

    在第6分钟时,出现了第一种、第二种、第三种、第六种怪物。
    示例4

    输入

    3 5
    6 6 6
    

    输出

    0 5
    

    说明

    在第1分钟、第2分钟、第3分钟、第4分钟、第5分钟,都没有出现怪物。
    解题思路:埃氏筛nlogn暴力过。
    AC代码:
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long LL;
     4 const int maxn=1e6+5;
     5 int n,k,x,maxxx,cnt[maxn],ans1[maxn],ans2[maxn];
     6 int main(){
     7     while(~scanf("%d%d",&n,&k)){
     8         memset(cnt,0,sizeof(cnt));
     9         memset(ans1,0,sizeof(ans1));
    10         memset(ans2,0,sizeof(ans2));maxxx=0;
    11         for(int i=0;i<n;++i)scanf("%d",&x),cnt[x]++;
    12         for(int i=1;i<=k;++i){
    13             if(!cnt[i])continue;
    14             for(int j=i;j<=k;j+=i)
    15                 ans1[j]+=cnt[i];///统计每个时间点的怪物种类数
    16         }
    17         for(int i=1;i<=k;++i)maxxx=max(maxxx,ans1[i]),ans2[ans1[i]]++;///最大种类数出现的时间点个数
    18         printf("%d %d
    ",maxxx,ans2[maxxx]);
    19     }
    20     return 0;
    21 }

     C.tokitsukaze and Number Game

    题目描述

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

    输入描述:

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

    输出描述:

    请输出用这些数字组成出能被8整除的最大的数,如果无法组成出能被8整除的数,请输出-1。
    示例1

    输入

    2
    666
    1256
    

    输出

    -1
    6512
    解题思路:结论:如果一个数的后三位能被8整除,那么这个数就能被8整除。特判位数为1和2的数。不小于3位数的数的处理思路:统计0~9每个数字出现的次数,然后枚举不大于1000且为8的倍数的数,如果后三位每位上对应数字出现的次数减1后都不小于0,说明这个数中每位重排后能得到较大的且为8的倍数的数,则只需降序贪心添加每一位后取满足条件的最大数即可。
    AC代码:
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long LL;
     4 const int maxn=105;
     5 char str[maxn],num[maxn];int T,len,tmp1,tmp2,tmp3,tmp4,a,b,c,cnt[10];bool fuck;string ans,tmp0;
     6 int main(){
     7     while(cin>>T){
     8         while(T--){
     9             cin>>str,len=strlen(str),fuck=false,ans="";
    10             memset(num,0,sizeof(num)),memset(cnt,0,sizeof(cnt));
    11             for(int i=0;i<len;++i)cnt[num[i]=str[i]-'0']++;
    12             if(len==1)cout<<(num[0]%8?-1:num[0])<<endl;///特判1位和2位
    13             else if(len==2){
    14                 tmp1=num[0]*10+num[1],tmp2=num[1]*10+num[0];
    15                 tmp3=tmp1%8?-1:tmp1,tmp4=tmp2%8?-1:tmp2;
    16                 cout<<max(tmp3,tmp4)<<endl;
    17             }else{
    18                 for(int s=0;s<1000;s+=8){///枚举8的倍数
    19                     cnt[a=s%10]--,cnt[b=s/10%10]--,cnt[c=s/100]--;
    20                     if(cnt[a]>=0&&cnt[b]>=0&&cnt[c]>=0){
    21                         tmp0="";
    22                         for(int i=9;i>=0;--i)///减去后三位后剩下的几个数降序排
    23                             for(int j=1;j<=cnt[i];++j)
    24                                 tmp0+=i+'0';
    25                         fuck=true,tmp0+=c+'0',tmp0+=b+'0',tmp0+=a+'0';///后三位为可被8整出的最小三位数
    26                         if(ans<tmp0)ans=tmp0;
    27                     }
    28                     cnt[a]++,cnt[b]++,cnt[c]++;///还原个数
    29                 }
    30                 if(!fuck)puts("-1");
    31                 else cout<<ans<<endl;
    32             }
    33         }
    34     }
    35     return 0;
    36 }
  • 相关阅读:
    TWebBrowser 与 MSHTML(3): window 对象的属性、方法、事件纵览
    使 SaveDialog 对话框的文件名选择变灰 回复 "delphan" 的问题
    [最新通知]今日17:0019:00将不能访问博客园
    编辑器改进(三)
    博客园.Text技术支持移至PSP技术支持中心
    [公告]关于投稿到Dearbook的“读书笔记”专栏
    [致歉]博客园服务器停运时间超出计划时间
    [博客园公告]给发表评论增加了验证码功能
    CS Beta 1发布了
    [通知]11月6日(星期六)可能不能访问博客园
  • 原文地址:https://www.cnblogs.com/acgoto/p/10086227.html
Copyright © 2020-2023  润新知