1.12,upc2021寒假个人训练第四场

问题 A: 包裹托运

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

水题,直接上代码(ง •̀_•́)ง

# include<iostream>
 
using namespace std;
double x,y;
int main(){
     cin>>x;
     if(x<=15)  y=x*6;
     else {
                  y=15*6+9*(x-15);
          }
        printf("%lld",(int)(y+0.5));
        return 0;
} 

问题 B: 字母图形

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

水题,知道substr应该做起来很快(ง •̀_•́)ง

# include<iostream>
 
using namespace std;
string s;
int main(){
      cin>>s;
      for(int i=0;i<s.size();i++){
          cout<<s<<endl;
          string str;
          str=s.substr(s.size()-2,2)+s.substr(0,s.length()-2);
          s=str;
      }
        return 0;
} 

问题 C: 海淀字符串

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

水题,会用isdigit就好了(ง •̀_•́)ง

# include<iostream>
# include<string>
using namespace std;
int cnt;
string s;
int main(){
      cin>>s;
      for(int i=0;i<s.size();i++){
         if(isdigit(s[i])) cnt++;
          else cout<<s[i];
      }
      cout<<endl<<cnt<<endl;
        return 0;
} 

问题 D: 数字游戏

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

输入
只有一行,包含用一个空格隔开的两个四位自然数M和N(其中1000≤M<N≤9999)。
输出
共有两行:
第一行:为所有满足上述条件的数值,数值之间用一个空格隔开;
最后一行:只有一个数,为满足上述条件的数值的个数。
样例输入
2000 3000
样例输出
2304 2316 2364 2904 2916 2964
6
这题一开始自己想玩花得,if里面条件写满,结果发现运行不对,后来改了半天发现是筛法写错了。。T.T

# include<iostream>
# include<string>
# include<cmath>
using namespace std;
int n,m,f[100],cnt;
void fun(){
    for(int i=2;i<=10;i++)
     if(f[i]==0) for(int j=i*i;j<=100;j+=i)
                   f[j]=1;
}
int main(){
      fun();
      cin>>n>>m;
      for(int i=n;i<=m;i++){
        if(i%6==0){
                      int a=i/1000;
                      int b=i/100%10;
                      int c=i/10%10;
                      int d=i%10;
                      int x=a*10+b;
                      int y=c*10+d;
                      if(f[x]==0&&((int)sqrt(y)*(int)sqrt(y)==y))
                      cout<<i<<" ",cnt++;
                  }
             
      }
      cout<<endl<<cnt-1<<endl;
      return 0;
} 

问题 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格。

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

水题 (ง •̀_•́)ง

# include<iostream>
# include<string>
# include<cmath>
# include<algorithm>
using namespace std;
int n,m,a[10][10],b[20],t;
double s[10];
int main(){
      cin>>n>>m;
      for(int i=0;i<n;i++){
        s[i]=0;int maxn=0;
        for(int j=0;j<m;j++){
             cin>>a[i][j];
             if(a[i][j]>165) b[t++]=a[i][j];
             maxn=max(maxn,a[i][j]);
             s[i]+=a[i][j];
          }
          s[i]/=m;
          cout<<maxn<<endl; 
      }
      for(int i=0;i<n;i++)
       printf("%d\n",(int)(s[i]+0.5));
      sort(b,b+t,greater<int>()); 
      for(int i=0;i<t;i++)
       cout<<b[i]<<" ";
      return 0;
} 

问题 F: 分蛋糕

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

# include<iostream>
# include<string>
# include<cmath>
# include<algorithm>
using namespace std;
typedef long long ll;
int n;
ll a[10005],ans,s;
int main(){
      cin>>n;
      for(int i=0;i<n;i++)
       cin>>a[i];
      sort(a,a+n);
      if(n&1){
                s=a[n/2];  
             }
      else   {
               s=(a[n/2]+a[n/2-1])/2;
             }
      for(int i=0;i<n;i++)
       ans+=abs(s-a[i]);
     cout<<ans<<endl;
      return 0;
} 

问题 G: 垒城堡

题目描述
XJR从小就喜欢用积木搭建各种各样的模型,虽然现在上六年级了,学习任务重了很多,但他学习之余,有空还忘不了拿出他那些积木进行一些富有创意的实验。一天,他拿出了一盒积木,碰巧发现这个盒子里装的所有积木都是棱长不等的正方体,他突发奇想,我拿这些积木来垒一个城堡,这个城堡可能达到多大的高度呢?XJR数学很好,他知道这些积木可以实现多种不同的高度,已知这些积木的棱长,他从数学角度推算出可能能够获得多少种不同的高度,但比较复杂。会编程的你,用程序来实现应该不是一件难事,你能帮助XJR用程序来实现吗?
已知积木的个数和每一个积木的棱长,你至少从中选择一个积木垒建城堡,请你编程求出城堡可以达到多少种不同的高度。

输入
共有两行:
第一行:是一个整数N(N<=100),表示一共有N个积木;
第二行:是N个正整数,两数之间用一个空格分隔,分别表示N个积木的棱长,每个积木的棱长不超过100。积木按照从大到小的尺寸给出。
输出
只有一个整数,表示城堡可能达到的多少种不同高度。
样例输入
3
3 2 1
样例输出
6
没写出来,补的,看别人的意思大概是:把所有可能的方案存下来,遇到一个新的就更新所有的方案,用vis[i]=1代表i可以被组合

# include<iostream>
 
using namespace std;
typedef long long ll;
ll vis[10005],a[105],num,ans,n;
int main(){
      cin>>n;
      for(int i=1;i<=n;i++){
        cin>>a[i];
        num+=a[i];
      }
      vis[0]=1;
      for(int i=1;i<=n;i++){
         for(int j=num;j>=0;j--)
          if(vis[j]==1)  vis[j+a[i]]=1;
      }
      for(int i=1;i<=num;i++)
       if(vis[i]==1) ans++;
    cout<<ans<<endl;
    return 0;
}

问题 H: 哈夫曼编码

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

排个序就解决了 (ง •̀_•́)ง

# include<iostream>
# include<string>
# include<algorithm>
using namespace std;
struct Node{
    char id;
    int num;
}a[30];
string s;
bool cmp(Node a,Node b){
     if(a.num == b.num )  return a.id <b.id;
     else return a.num >b.num ;
}
int main(){
     cin>>s;
     int j=0;
     for(int i=0;i<s.size();i++){
         a[s[i]-'a'].id=s[i];
         a[s[i]-'a'].num ++;
     }
     sort(a,a+26,cmp);
     for(int i=0;i<30;i++)
      if(a[i].num !=0)  cout<<a[i].id <<" "<<a[i].num <<endl;
      return 0;
}

问题 I: 立方和

题目描述
现给出一个三位数,先对这个三位数的各位数字的立方求和,然后再对求出的和中的各位数字的立方求和,如此一直继续下去,判断最后能否得到一个不再变化的固定值。如能得到一个固定值,就求出这个固定值;如果不能,则输出提示信息“error”。另外请注意,在求解过程中,若某一次求和过程中得到的值超过三位数,则只取后三位继续求立方和……
例如,对于三位数111,则第一次计算应是1×1×1+1×1×1+1×1×1=3,第二次计算应是0×0×0+0×0×0+3×3×3=27,第三次计算应是0×0×0+2×2×2+7×7×7=351,第四次计算应是3×3×3+5×5×5+1×1×1=153,第五次计算应是1×1×1+5×5×5+3×3×3=153,与第四次计算的结果相同,这时可不再计算,输出固定值153。
亲爱的同学,请你也来计算一下。
输入
输入只有一行,是一个三位数。
输出
输出也只有一行,如能得到一个固定值,则输出这个固定值;如不能,则输出一个提示信息“error”。
样例输入
111
样例输出
153
这题有两个坑:
1.不一定是一个固定值,如果不明确一个结束条件大概率就会超时
2.立方和出来不一定是三位数,可能超过三位数。
(然后就错了两次T.T)

# include<iostream>
 
using namespace std;
int n,sum,a,b,c,ans;
int main(){
      cin>>n;
      while(1){
          a=n/100;b=n/10%10;c=n%10;
          sum=a*a*a+b*b*b+c*c*c;
          if(sum==n) {
                           cout<<sum<<endl;
                           return 0;
                         }
         n=sum;ans++;
         if(ans>=1000)  {
                            cout<<"error"<<endl;
                             return 0;
                        }
         while(n>=1000)  n-=1000;
      }
      return 0;
}

问题 J: 智力大奖赛

题目描述
一年一度的校园智力大奖赛是小明最喜爱的活动,今年的比赛中学校新设了一个智取能量棒的项目,小明很想参加。这个项目的比赛规则是这样的:考官在一个仪器上输入一个数,仪器屏幕上就会出现一个由许多能量棒组成的大三角形(一个大三角形有若干个小三角形组成),已知每根能量棒的长度都是一样的,每个小三角形由三根能量棒组成,若谁能快速答出其中小三角形的个数和能量棒的总个数,则谁就赢得了比赛,这些能量棒作为奖励也就属于他了。现在小明想邀请你和他一起参加这项比赛。

输入
输入只有一行,有一个整数N,表示大三角形的层数(N≦45000)。
输出
输出有两行。
第一行只有一个数,表示小三角形的个数;
第二行也只有一个数,表示能量棒的个数。
样例输入
8
样例输出
64
108

找规律就行
1.小三角的个数就是n^2
2.每层能量棒的个数成等差数列
然后就直接写代码……

# include<iostream>
# include<cmath>
using namespace std;
typedef long long ll;
ll n,ans,a[45005],j;
int main(){
      cin>>n;
      a[1]=3;j=6;
      for(int i=2;i<=n;i++,j+=3)
       a[i]=a[i-1]+j;
      ans=pow(n,2);
      cout<<ans<<endl<<a[n]<<endl;
      return 0;
}

问题 K: 求素数I

题目描述
现给你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的数字,中间用空格隔开。
输出
输出只有一行,含全部满足条件的素数,中间用逗号隔开。
样例输入
10 3
8 9 1 0 2 3 5 4 7 6
样例输出
547

一开始做的时候以为是L位数之间的所有素数,然后把输出以为是所有个数,然后后来看看不对劲怎么还有逗号,然后仔细一看,心态炸了。。一开始还想这题暴力不是铁超时嘛,我大意了,还好一次过了。。
本来想用set的,后来发现set的输出不会搞。。。丢人T.T

# include<iostream>
# include<algorithm>
# include<cmath>
# include<set>
using namespace std;
typedef long long ll;
const ll maxn=1e7+1;
ll n,l,a[1005],b[maxn],ans,t,q[200];
void fun(){
    for(int i=2;i<=sqrt(maxn);i++)
     if(b[i]==0) {
                   for(int j=i*i;j<=maxn;j+=i)
                    b[j]=1;
                 }
}
int main(){
      fun();
      cin>>n>>l;
      for(int i=1;i<=n;i++)
       cin>>a[i];
      for(int i=1;i<=n-l+1;i++){
        ll cnt=0;
        if(a[i]==0) continue;
         for(int j=i;j<=i+l-1;j++)
           cnt=cnt*10+a[j];
          if(b[cnt]==0) q[t++]=cnt;
      } 
     sort(q,q+t);
     int i=0,j=1;
     while(j<t){
         if(q[i]!=q[j])  q[++i]=q[j];
          j++; 
     }
     for(int j=0;j<=i;j++)
     if(j==0) cout<<q[j];
     else     cout<<","<<q[j];
      return 0;
}
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一届宁波――绍兴少儿信息学联赛(小学组) 主办:宁波市科协、教育局承办:宁波市青少年科技中心、青少年科技辅导员协会 绍兴市科协、教育局绍兴科技馆、市教育教学研究院、市互联网协会 第一届宁波――绍兴少儿信息学联赛 暨第28届宁波市中小学生计算机程序设 计竞赛 第11 届绍兴市少儿信息学竞赛 复赛试题 (2013 年4 月13 日下午1:30-4:00) 一、题目一览 中文题目名称哈夫曼编码立方和智力大奖赛求素数 英文题目名称coding cubsum energy prime 输入文件名coding.in cubsum.in energy.in prime.in 输出文件名coding.out cubsum.out energy.out prime.out 每个测试点时限1 秒1 秒1 秒1 秒 测试点数目10 10 10 10 每个测试点分值10 10 10 10 二、比赛目录结构示例 选手比赛时,需在本机为每题建立对应的题目目录,目录名称与题目英文名称相同。 选手根据题目要求,将自己提交的源程序,放在该题的题目目录下。 每位选手把自己提交的源程序连同要求的目录结构,存入D 盘根目录中。(只递交 源程序,测试时以源程序为准) 例如:假设试卷中有cashier、dune、manhattan 三题,选手sx1001 使用Pascal 答题,其最终提交的文件为cashier.pas、dune.pas、manhattan.pas,则该选手提交的 目录结构如下所示: |---sx1001/ |---cashier/ |---cashier.pas |---dune/ |---dune.pas |---manhattan/ |---manhattan.pas 三、特别提醒 1、务必看清题目,严格按照试题所要求的格式输入、输出。 2、比赛开始前应先检查本机能否正常使用,如有问题可向监考老师提出。比赛结束后应及时离开机房,但注意不要关机。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值