Contest2656 - 2021ACM俱乐部后备营个人训练赛第4场

10356 Problem A 包裹托运
题目描述
春节快到了,小红和爸爸一起来到邮局,打算给家住外地的爷爷、奶奶家里捎点年货。邮局的阿姨介绍,托运包裹的运费标准是:包裹重量不大于15公斤时,每公斤6元;超过15公斤后,其超过部分每公斤9元;现已知:包裹的重量为X公斤,请同学们和小红一起帮助邮局的阿姨计算一下,包裹的运费Y应为多少元?
输入
只有一行,包含一个数值X(其中1≤X≤100)表示包裹的重量,单位:公斤。
输出
只有一行,包含1个整数,表示包裹的运费(要求四舍五入保留整数),单位:元。
样例输入 Copy
11.6
样例输出 Copy
70

#include
int cnt=0;
using namespace std;
 
typedef struct stu{
     
    int x,j;
}ss;
int cmp(ss a,ss b)
{
     
    return a.x>b.x;
}
 
const int maxn=1e6+7;
 
int p[maxn];
int main()
{
     
    double a;
    double jz;
    cin>>a;
    if(a<=15)
    {
     
        jz=a*6;
    }
    else
    {
     
        jz=15*6+(a-15)*9;
    }
    printf("%d",int(jz+0.55555));
    return 0;
}

10357 Problem B 字母图形题目描述
由键盘输入任意的一个由大写字母组成的字符串(不需检验是否为大写字母),要求以字符串的长度L作为图形的行数,并将输入的这个字符串作为图形的第一行进行打印输出。从第二行开始,图形的特点是:将第一行的最后两个字符整体移到最前就是第二行,再把第二行的最后两个字符整体移到最前就是第三行,……依次进行,完成L行字母的输出。例如:输入字符串“ABCDE”, 按照上述移动的规则,最后输出的图形如下列样例输出图形所示。
输入
只有一个由大写字母组成的字符串,字符串的长度为L(其中3≤L≤26)。
输出
输出对应的图形。
样例输入 Copy
ABCDE
样例输出 Copy
ABCDE
DEABC
BCDEA
EABCD
CDEAB

#include 
using namespace std;
typedef long long ll;
priority_queue <string,vector<string>,less<string> > mm;
priority_queue <int,vector<int>,greater<int> >  qq;
 
const int maxn=1e3;
 
int main()
{
     
 
 
    int sum=0;
 
   char s[maxn]={
     '\0'};
   char qs;
   char b;
   scanf("%s",s);
   int len=strlen(s);
   printf("%s",s);
   int t=len-1;
   while(t--)
   {
     
        qs=s[len-2];
         b=s[len-1];
         for(int i=len-3;i>=0;i--)
       {
     
         s[i+2]=s[i];
        }
 
        s[0]=qs;
        s[1]=b;
         printf("\n%s",s);
 
   }
 
 
    return 0;
}
 
10358 Problem  C	海淀字符串
描述

从键盘输入一个由大、小写字母和数字组成的任意一个字符串(不需判断),其长度不小于8,不大于30。现要求将字符串中的所有数字字符删除,其他字符依照原有顺序保持不变,并统计删除的数字的个数。
输入
只有一行,包含只由大、小写字母和数字组成的一个字符串(其长度8≤L≤30)。
输出
共有两行:
第一行:为删除数字字符后的字符串;
第二行:为统计删除的数字的个数。
样例输入 Copy
ABCD123efg678
样例输出 Copy
ABCDefg
6

#include 
using namespace std;
typedef long long ll;
priority_queue <string,vector<string>,less<string> > q;
priority_queue <int,vector<int>,greater<int> >  qq;
int cmp(string a,string b)
{
     
    return a+b>b+a;
}
const int maxn=2e5+7;
typedef struct sfa{
     
 
    int x;
    int j;
 
}ss;
ss p[maxn];
ll pp[maxn]={
     0};
int sum=0;
int maxsum=-1;
int n,m,k;
 
char a[maxn];
 
 
int pan(int n)
{
     
 
    if(n==0||n==1)return 0;
    for(int i=2;i<=sqrt(n);i++)
    {
     
        if(n%i==0)
            return 0;
    }
    return 1;
}
 
int main()
{
     
 
 
    int sum=0;
    gets(a);
 
    for(int i=0;i<strlen(a);i++)
    {
     
        if(a[i]>='0'&&a[i]<='9')
            sum++;
        else
            cout<<a[i];
    }
    cout<<endl;
    cout<<sum;
 
 
    return 0;
}

10359 Problem D 数字游戏
题目描述
小明和小华两位同学是非常要好的小伙伴。两人经常在一起做作业、玩游戏。周末的一天,两人做完作业后,商量一起玩一个数字游戏。游戏的规则是:在任意的一段四位自然数区间内,找出符合以下特点的四位自然数ABCD:
(1)这个四位自然数被6整除;
(2)千位数字与百位数字构成的两位数AB是一个质数;
(3)十位数字与个位数字构成的两位数CD是一个完全平方数。
没有学过程序设计的小华同学,在(2000,3000)的范围中,找出的符合以上特点的数字只有三个:2316,2916, 2964,显然他找到的数据不够全面,漏掉了一些数字。而学过程序设计的小明同学用计算机编程的方法很快求出了所有符合要求的答案。现给出任意自然数M ~N的区间,作为编程小能手的你,能否很快求出所有满足上述条件的数值,并统计出它们的个数呢?

输入
只有一行,包含用一个空格隔开的两个四位自然数M和N(其中1000≤M 输出
共有两行:
第一行:为所有满足上述条件的数值,数值之间用一个空格隔开;
最后一行:只有一个数,为满足上述条件的数值的个数。
样例输入 Copy
2000 3000
样例输出 Copy
2304 2316 2364 2904 2916 2964
6

#include
using namespace std;
#define IN -1e6
#define INT 1e6
const int maxn=1e6;
int res=1;
typedef long long ll;
 
int sum=0;
int bn=0;
int a[maxn];
int k=0;
int pan(int n)
{
     
    for(int i=2;i<=sqrt(n);i++)
        if(n%i==0)
        return 0;
 
    return 1;
}
int pan1(int n)
{
     
    int t=int(sqrt(n));
    if(t*t==n)
        return 1;
    return 0;
}
int main()
{
     
 
   int n,m;
   cin>>n>>m;
   if(n>m)
   swap(n,m);
   for(int i=n+1;i<m;i++)
   {
     
       int sa=i/1000*10+i/100%10;
       int sd=i/10%10*10+i%10;
       if(pan(sa)&&pan1(sd)&&i%6==0)
       {
     
           a[sum]=i;
           sum++;
       }
   }
   for(int i=0;i<sum;i++)
   {
     
       cout<<a[i];
       if(i!=sum-1)
        cout<<' ';
   }
   cout<<endl;
   cout<<sum;
 
    return 0;
}
 

10360 Problem E 挑选队员I
题目描述
学校舞蹈小组举行形体课训练,王老师将队员的队形编排成了M行N列,现已知所有队员的身高,数值为整数,单位:厘米。根据舞蹈的要求:要在所有队员中:
(1)挑选出每行身高最高的同学作为小组的组长协助老师进行训练;
(2)求出每行队员们的平均身高;
(3)最后要在所有队员中挑选出身高大于165厘米的队员进行领舞,并将身高大于165厘米的队员按从高到低的顺序重新排队。
请同学们用计算机编程的方法来解决以上问题。
输入
共有M+1行:
第一行有:用空格隔开的两个整数M、N,分别代表身高数据的行数和列数(其中1≤M≤6,1≤N≤8);
后M行:每一行对应的是N列数据,表示所有学生的身高尺寸,数值为整数,单位:厘米(其中:150厘米≤身高≤180厘米),数据之间空1格;

输出
共有2M+1行:
前M行:每行一个数据为在该行中身高最高的那位队员的高度;
后M行:每行一个数据为每行队员的平均身高(要求:四舍五入,保留整数);
最后一行:为所有身高大于165厘米的队员的身高(按从高到低的顺序),数据之间空1格。

样例输入 Copy
3 4
151 161 156 154
171 163 168 157
162 156 153 172
样例输出 Copy
161
171
172
156
165
161
172 171 168

#include
using namespace std;
#define IN -1e6
#define INT 1e6
const int maxn=1e6;
int res=1;
typedef long long ll;
 
int sum[maxn];
int bn[maxn];
int a[maxn];
int k=0;
 
int main()
{
     
 
   int n,m;
   cin>>n>>m;
   for(int i=0;i<n;i++)
   {
     
       int mas=-10;
       int tp=0;
       for(int j=0;j<m;j++)
       {
     
           int x;
           cin>>x;
        if(x>165)
       {
     
           a[k++]=x;
       }
           tp+=x;
           mas=mas<x?x:mas;
       }
       bn[i]=mas;
       sum[i]=int ((tp*1.0)/m+0.555);
 
 
   }
 
   for(int i=0;i<n;i++)  cout<<bn[i]<<endl;
   for(int i=0;i<n;i++)   cout<<sum[i]<<endl;
   sort(a,a+k);
   for(int i=k-1;i>=0;i--) {
     
 
        cout<<a[i];
        if(i!=0)
            cout<<' ';
   }
    return 0;
}

10361 Problem F 分蛋糕

题目描述
WZJ过生日了,他邀请了许多人来参加她的生日聚会,生日聚会中最重要的一件事情就是吃蛋糕了。WZJ共邀请了n个人,这些人的心里都想好了自己要多少克蛋糕。如果给他少了,他就会郁闷(没有吃到足够多的蛋糕)。如果给他多了,他也会郁闷(因为他不能浪费,需要把这些蛋糕都吃了,撑着了会不舒服)。一个人的郁闷指数为他想要的蛋糕克数与他实际得到的蛋糕克数之差的绝对值。WZJ想指定一个人想要的蛋糕克数作为标准,给每个人都是这么多蛋糕。聚会是件高兴的事情,同学们郁闷指数之和越小越好,现在他需要知道同学们的郁闷指数最低值是多少,请你编写程序帮他实现。
输入
共有两行:
第一行:为正整数n,表示参加聚会总共有n位同学。
第二行:为n个正整数(n<10000),表示每个人想要得到的蛋糕克数(<=1000)。
输出
只有一行:为输出所有人的郁闷指数之和的最小值。
样例输入 Copy
5
100 300 200 100 300
样例输出 Copy
400

 #include
    using namespace std;
    #define IN -1e6
    #define INT 1e6
    const int maxn=1e6;
    int res=1;
    typedef long long ll;
 
    int a[maxn];
    int main()
    {
     
        int n;
        ll sum=0;
        cin>>n;
        if(n==0||n==1)
        {
     
            cout<<0;
            return 0;
        }
        for(int i=0;i<n;i++)
            cin>>a[i], sum+=a[i];
        sum/=n;
        int sn;
        ll bn=0;
        sort(a,a+n);
 
        for(int i=0;i<n;i++) bn+=abs(a[i]-a[n/2]);
       cout<<bn;
        return 0;
    }

5805 Problem H 哈夫曼编码
题目描述
哈夫曼编码是一种编码方式,是可变字长编码的一种,由Huffman于1952年提出。该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫Huffman编码。简单地来说,就是出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的。
现在请你模拟这样的原则对给定的一个字符串进行字母统计。
输入
输入只有一行,是一个字符串,由小写英文字母组成,长度不超过255个字符。
输出
输出有若干行,每行有两部分组成:一个字母和该字母出现的频率,中间用一个空格分隔,并按频率高低排列,频率相同时则按字母的ASC码的先后顺序排列。
样例输入 Copy
soon
样例输出 Copy
o 2
n 1
s 1

#include
    using namespace std;
    #define IN -1e6
    #define INT 1e6
    const int maxn=1e6;
    int res=1;
    typedef long long ll;
 
    char a[maxn];
 
    typedef struct st{
     
 
            int x=0;
            int ac;
 
    }ss;
 
    ss b[maxn];
 
    int cmp(ss a,ss b)
    {
     
        if(a.x==b.x)
            return a.ac<b.ac;
        return a.x>b.x;
    }
    int main()
    {
     
       gets(a);
       int n=strlen(a);
       for(int i=0;i<n;i++)
       {
     
           b[a[i]].x++;
           b[a[i]].ac=int(a[i]);
       }
 
       sort(b+10,b+200,cmp);
 
       for(int i=10;i<200;i++)
       {
     
           if(b[i].x!=0)
           {
     
               printf("%c ",char(b[i].ac));
               printf("%d\n",b[i].x);
           }
       }
        return 0;
    }
 

Problem J 智力大奖赛
一年一度的校园智力大奖赛是小明最喜爱的活动,今年的比赛中学校新设了一个智取能量棒的项目,小明很想参加。这个项目的比赛规则是这样的:考官在一个仪器上输入一个数,仪器屏幕上就会出现一个由许多能量棒组成的大三角形(一个大三角形有若干个小三角形组成),已知每根能量棒的长度都是一样的,每个小三角形由三根能量棒组成,若谁能快速答出其中小三角形的个数和能量棒的总个数,则谁就赢得了比赛,这些能量棒作为奖励也就属于他了。现在小明想邀请你和他一起参加这项比赛。
Contest2656 - 2021ACM俱乐部后备营个人训练赛第4场_第1张图片

输入
输入只有一行,有一个整数N,表示大三角形的层数(N≦45000)。
输出
输出有两行。
第一行只有一个数,表示小三角形的个数;
第二行也只有一个数,表示能量棒的个数。
样例输入 Copy
8
样例输出 Copy
64
108
提示
在40%的数据中,1≤N≤150在70%的数据中,1≤N≤30000
在100%的数据中,1≤N≤45000

#include
int cnt=0;
using namespace std;
 
typedef struct stu{
     
    int x,j;
}ss;
int cmp(ss a,ss b)
{
     
    return a.x>b.x;
}
 
const int maxn=1e6+7;
 
int p[maxn];
int main()
{
     
    double a;
    double jz;
    cin>>a;
    if(a<=15)
    {
     
        jz=a*6;
    }
    else
    {
     
        jz=15*6+(a-15)*9;
    }
    printf("%d",int(jz+0.55555));
    return 0;
}

问题 K: 求素数I
时间限制: 1 Sec 内存限制: 128 MB

题目描述
现给你N个0~9的数字并排成了一列,同时还给出了一个取数长度L。规定先从第1个数字开始从左往右连续取L个数字,拼成一个长度为L位(最高位为0的L-1位数除外)的数,然后从第2个数字开始从左往右连续取L个数字……,这样,最后最多可以得到N-L+1个L位数。现在请你将这些L位数中的素数按从小到大的顺序输出(如果产生重复,只需输出一个)。
输入
输入共有两行。
第一行为N和L,中间用空格隔开。(1≤N≤100,1≤L≤7)第二行为N个0~9的数字,中间用空格隔开。
输出
输出只有一行,含全部满足条件的素数,中间用逗号隔开。
样例输入 Copy
10 3
8 9 1 0 2 3 5 4 7 6
样例输出 Copy
547

#include 
using namespace std;
typedef long long ll;
priority_queue <string,vector<string>,less<string> > q;
priority_queue <int,vector<int>,greater<int> >  qq;
int cmp(string a,string b)
{
     
    return a+b>b+a;
}
const int maxn=2e5+7;
typedef struct sfa{
     
 
    int x;
    int j;
 
}ss;
ss p[maxn];
ll pp[maxn]={
     0};
int sum=0;
int maxsum=-1;
int n,m,k;
 
int a[maxn];
 
 
int pan(int n)
{
     
 
    if(n==0||n==1)return 0;
    for(int i=2;i<=sqrt(n);i++)
    {
     
        if(n%i==0)
            return 0;
    }
    return 1;
}
 
int main()
{
     
 
    cin>>n>>k;
    for(int i=0;i<n;i++)
    {
     
        cin>>a[i];
    }
    int j=0;
    for(int i=0;i<n-k+1;i++)
    {
     
        if(a[i]==0)
            continue;
        j=0;
        for(int s=i;s<i+k;s++)
         j=j*10+a[s];
 
    if(pan(j))
        qq.push(j);
 
    }
 
    while(qq.size())
    {
     
        if(pp[qq.top()]==1)
        {
     
            int bj=qq.top();
            qq.pop();
            if(qq.size()&&bj!=qq.top())
                putchar(',');
            continue;
        }
        cout<<qq.top();
       pp[qq.top()]=1;
       int ts=qq.top();
 
        qq.pop();
          if(qq.size()&&ts!=qq.top())
            putchar(',');
    }
 
 
 
    return 0;
}

你可能感兴趣的:(笔记,题目)