2022年寒假训练赛第1场

A: 十六进制回文数

  • 枚举判断
#include <bits/stdc++.h>
using namespace std;
#define ll long long

bool check1(int n){//判断本身是否回文
    string s = to_string(n);
    string s1 = s;
    reverse(s1.begin(),s1.end());
    return s == s1;
}
bool check2(int n){//判断十六进制数是否回文
    string s="";
    while(n){
        int m = n%16;
        string str="0";
        if(m<10)str[0]='0'+m;
        else str[0]='A'+m-10;
        s+=str;
        n/=16;
    }
    string s1 = s;
    reverse(s1.begin(),s1.end());
    return s == s1;
}
int main(){
    int n,m;
    int ans = 0;
    scanf("%d%d",&m,&n);
    for(int i = m;i <= n; i++)
        if(!check1(i) && check2(i))ans++;
    printf("%d\n",ans);
    return 0;
}

B: lsx的立方体

  • 每一个边长为1的小立方体可构成8个等边三角形
  • 不管边长为多少都可以看成一个边长为1的小立方体
  • 计算总共有多少个小立方体
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n,k;
int main(){
    while(~scanf("%d",&n)){
        ll ans=n*n*n;//边长为1的立方体数量
        
       for(int i = 2;i <= n; i++){
            int m = (n-i)+1;
            ans+=m*m*m;
       }
        printf("%lld\n",ans*8);
    }
    return 0;
}

C: X星切糕

  • 贪心
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
    int n,ans;
    scanf("%d",&n);
    ans=20*(n/5);
    n%=5;
    if(n==4)ans+=15;
    else if(n==3)ans+=11;
    else if(n==2)ans+=7;
    else if(n==1)ans+=3;
    printf("%d\n",ans);
    return 0;
}

D: 解密

  • 枚举出每一个子串,查找是否是重复子串
#include<bits/stdc++.h>
using namespace std;

int Find(string str){
    int len = str.length();
    int maxx = 0;
    
    for(int i= 0; i< len; i++){
            
        for(int j= len- 1; j > i; j--){//枚举子串
                
            string st = str.substr(i,j-i);
            int len1 = st.length();
            int from = str.find(st);//从前往后查找
            int to = str.rfind(st);//从后往前查找
        
            if(from!=to&&maxx<j-i){//两次查找位置不同,说明是重复子串
              if(len1+from<=to)//两个相同的子串不允许出现交叉和重叠
                maxx= j-i;
            }
        }
    }
    return maxx;
}
int main(){
    string str;
    cin>>str;
    int in = Find(str);
    cout<<in<<endl;
    return 0;
}

E: 第K大数

  • 简单模拟
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n,k;
int main(){
    scanf("%d%d",&n,&k);
    set<int,greater<int> >st;//从大到小
    while(n--){
        int d;
        scanf("%d",&d);
        st.insert(d);
    }
    if(k>st.size())printf("-1\n");
    else{
        set<int>::iterator it=st.begin();
        while(--k){
            it++;
        }
        printf("%d\n",*it);
    }
    return 0;
}

F: 字符串变换

  • 简单模拟
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n,k;
int main(){
    cin>>n>>k;
    string s;
    cin>>s;
    string s1="";
    for(int i=0;i+k<=n;i+=k){//能组成k个一组
    
        for(int j=k-1;j>=0;j--){
            if(islower(s[j+i]))s1+=toupper(s[j+i]);
            else s1+=s[j+i];
        }
    }
    
    for(int i=1;i<=n%k;i++){//多于部分
    
         if(islower(s[n-i]))s1+=toupper(s[n-i]);
         else s1+=s[n-i];
    }
    cout<<s1<<endl;
    return 0;
}

G: 评分计算器

  • 直接计算,注意全为0与去尾
#include<bits/stdc++.h>
using namespace std;
int main(){
   int a,b,c,d,e;
   float s;
   scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
   if(!a && !b && !c && !d && !e)printf("0.0\n");
   else{
        s=(float)(a+2*b+3*c+4*d+5*e)/(a+b+c+d+e);
        s=(float)((int)(s*10))/10;//去尾
        printf("%.1f\n",s);
   }
   return 0;
}

H: 缩页

  • 将页数从小到大排序,按要求输出
#include<bits/stdc++.h>
using namespace std;
#define MAX 10000005
#define MA 100005
int a[MA];
char c[MAX];
int main(){
    int i=0,j,k,t;
    gets(c);
    for(int j=0;j<strlen(c);j++){//将页数存入数组
            
        while(j<strlen(c)&&isdigit(c[j])){
            
            a[i]=a[i]*10+(c[j]-'0');
            j++;
        }
        i++;
    }
    sort(a,a+i);//页数从小到大排序
    
    for(k=0,t=a[0];k<i;k++){
            
        if(k+1<i&&(a[k]==a[k+1]||a[k]+1==a[k+1]))continue;
        //页数相同或页数加一等于后一页数,continue
        else if(k!=i-1){//判断后面有无输出
            
            if(t==a[k])printf("%d,",t);
            else printf("%d-%d,",t,a[k]);
            t=a[k+1];
        }
        else{
            
            if(t==a[k])printf("%d\n",t);
            else printf("%d-%d\n",t,a[k]);
            t=a[k+1];
        }
    }
    return 0;
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值