HNUCM2023年暑假ACM集训第1场

问题 D: 十六进制回文数

题目描述

小米在学习进制转换,今天学习的内容是十进制和十六进制之间的转换。
小米突然想到一个问题,有没有一些十进制正整数,它本身不是回文数,但是转成十六进制(去掉前导0)之后会变成回文数呢?
回文数是指那些从左往右和从右往左读都相同的数字,例如12321、ABBA等。十六进制中包含0-9以及A、B、C、D、E和F一共16个字符。
现在请你编写一个程序,统计在十进制正整数M和十进制正整数N之间(1<=M<N<=1000000)有多少个满足要求的数字(本身不是回文数,转成十六进制并去掉前导0之后会变成回文数)?如果在M和N之间一个满足要求的数字都没有则输出0。
【注意:一位数也是回文数。】

输入

单组输入。
输入两个十进制正整数M和N,1<=M<N<=1000000。两者之间用英文空格隔开。

输出

输出在M和N之间(包括M和N),满足本身不是回文数,但是转成十六进制并去掉前导0之后会变成回文数的数字的个数。如果在M和N之间一个满足要求的数字都没有则输出0。

样例输入
1 20
样例输出
6

进制转换,简单

#include <iostream>
#include<map>
using namespace std;
char f[17]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
string solve(int n)
{
    string s;
    while(n>0)
    {
        s+=f[n%16];
        n/=16;
    }
    return s;
}
bool solve2(string s)
{
    int l=0,r=s.length()-1;
    while(l<r)
    {
        if(s[l]!=s[r])return false;
        l++,r--;
    }
    return true;
}
int main()
{
   int n,m,ans=0;
   cin>>n>>m;
   for(int i=n;i<=m;i++)
   {
       string s=to_string(i);
       string s2=solve(i);
       if(!solve2(s)&&solve2(s2))ans++;
   }
   cout<<ans<<endl;
    return 0;
}

问题 H: 第K大数

题目描述

小米这几天在学习排序。今天他遇到这么一道题:
随机生成N个正整数,其中可能存在一些相同的数字,现在需要找到这N个正整数中第K个最大的整数。需要注意的是,如果存在多个正整数的大小相同,则相同的数字只能被计算一次。
你能否编写一个程序帮助小米找到这个第K大的正整数呢?

输入

单组输入。
第1行包含两个正整数N和K,两者之间用英文空格隔开,其中N<=106,K<=103。
第2行为N个正整数,两两之间用英文空格隔开。

输出

输出第K大的正整数;如果第K大正整数不存在,则输出“-1”。

样例输入
8 2
4 2 1 3 5 6 5 6
样例输出
5

用unique,注意unique()函数返回的是最后一个位置的迭代器

#include <iostream>
#include<algorithm>
using namespace std;
int num[1000010];
int main()
{
   int n,k;
   cin>>n>>k;
   for(int i=0;i<n;i++)
   {
       cin>>num[i];
   }
   sort(num,num+n,greater<int>());
   if((num+k-1)>unique(num,num+n)){
    cout<<-1;
   }
   else cout<<num[k-1];
    return 0;
}

问题 K: 缩页

某文本编辑软件的打印功能可以根据输入的页码来打印所需的页面。有时用户会输入“1,2,3,1,1,5,6”,但是实际上需要的打印的只有“1-3,5-6”这五页,这时就需要软件对用户输入的页码进行处理。

现在请你将用户输入的页码表示为l1-r1,l2-r2……的形式,如果li=ri,则只输出li即可,中间用逗号隔开。

输入

输入第一行包含若干个整数,最少一个,最多100000个,中间用逗号隔开(页号不大于100000)。

输出

输出包含若干个形如li-ri形式的页码段,中间用逗号隔开。

样例输入
1,2,3,1,1,2,6,6,2
样例输出
1-3,6

可以哈希一下

#include<bits/stdc++.h>
using namespace std;


int main()
{
    int i,j,maxn,a,b;				
    int num[100005];				
    string s;				
    while(cin>>s)
    {
        memset(num,0,sizeof num);
        int n=s.length(),cnt=0;
        for(int i=0;i<n;i++)
        {
            while(s[i]<'9'&&s[i]>'0'&&i<n)
            {
                num[cnt++]=num[cnt]*10+s[i]-'0';
            }
        }
        sort(num,num+cnt);
        int l=0,r=l+1;
        while(num[r]=num[l]+1)
        {
            l++;r++;
        }
    }
    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值