2018-2019赛季多校联合新生训练赛第四场

问题 A: 数一数时间限制: 1 Sec 内存限制: 128 MB
题目描述
星期天早上,小明开始做数学家庭作业。因为小明成绩很优异,觉得题目太简单了,思考出道难点的数学题去学校考考同学,他注意到:数学书的第10页和第11页在同一张纸上,但第11页和第12页不在同一张纸上。
哈哈,题目有了,请问数学书的第x页到第y页共有多少张纸呢?
例如:该书的第81页到第92页,共有7张纸。
输入一行两个数x、y如题所述,用空格隔开。
输出一个数,表示纸张数。
样例输入复制样例数据
81 92
样例输出7
提示50%:0<y-x<=15;
100%:1<=x,y<=longint;0<y-x<longint。

#include<stdio.h>
int main()
{
 int x,y;
 scanf("%d%d",&x,&y);
 if(x%2==0&&y%2==0||x%2!=0&&y%2!=0)
  printf("%d\n",(y-x)/2+1);
 if(x%2!=0&&y%2==0)
  printf("%d\n",(y-x)/2+2);
 if(x%2==0&&y%2!=0)
  printf("%d\n",(y-x)/2+1);
 return 0;
}

问题 B: 博物馆时间限制: 1 Sec 内存限制: 128 MB
提交: 566 解决: 192
题目描述
从前,有一个偌大的博物馆,每天都会有数以万计的人们来参观,欣赏这里的艺术作品。这一天,博物馆来了N批人,第i批人有Ai个人以及一个导游组成,他们依次到达,但同时也有一些批次的人离开,由于人次太多,博物馆的管理人员递给你一些人数表,就请你来统计一下剩下多少人。
输入第一行是个整数N,接下来N行。每行两个数,第一个数X,如果X=0则后面接一个数Ai,表示来了Ai个人;如果X=1,那么接下来就有一个数Y,表示来的人中的第Y批离开了。
输出一个数,表示剩下多少人。
样例输入复制样例数据

6
0 5
0 6
1 1
0 7
0 8
1 3
样例输出16

提示有四批人,每批人要加上一位导游,分别是6,7,8,9人,离开的是第1和3批,即走了6+8=14人,剩7+9=16人。

对于30%的数据,1≤N≤100,1≤Ai≤1000;
对于100%的数据,1≤N≤1000000,1≤Ai≤1000000。
保证:X只为0或1,Y一定符合要求。

#include<stdio.h>
int a[1000001][2],b[1000001];
/*在main函数中定义是不行的,
 C中定义整形数组长度为1000000只能有两种方法,
1是声明一个全局数组,2是在需要的函数中用malloc函数动态申请*/
int main()
{
 int i,n,k=1,sum=0;
 scanf("%d",&n);
 for(i=1;i<=n;i++)
 {
  scanf("%d%d",&a[i][0],&a[i][1]);
  if(a[i][0]==0)
  {
   b[k]=a[i][1]+1;
   k++;
   sum=sum+a[i][1]+1;
  }
  else
   sum=sum-b[a[i][1]];
 }
 printf("%d\n",sum);
 return 0;
}
这个题主要是卡到了数组定义上

问题 C: 旅游时间限制: 1 Sec 内存限制: 128 MB
提交: 532 解决: 199
题目描述
Lanlan的好朋友Qiqi来到了东莞,她决定带Qiqi去东莞的名胜景区旅游,以此增进友谊。但Qiqi不喜欢去拥挤度大于k的景点,而且旅游的时间不能是断开的。Lanlan现在知道了明天n个连续时间景区的拥挤度,她想知道她最多能陪Qiqi旅游多久。
输入第一行两个整数n,k。
第二行有n个整数表示每个时间的拥挤程度(数值小于1000)。
输出一个整数表示Lanlan最多能陪Qiqi的时间。
样例输入复制样例数据
20 2
1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
样例输出16

提示60%的数据 N<=1000

100%的数据 N<=100000

借用别人的题解,还没学C++,尴尬
#include<bits/stdc++.h>
using namespace std;
int a[100010];
int main() {
  int maxn=-1;
  int n,k;
  cin>>n>>k;
  for(int i=0;i<n;i++) {
    cin>>a[i];
  }
  int sum=0;
  for(int i=0;i<n;i++) {
    if(a[i]<=k)
    sum++;
    else
    sum=0;
    maxn=max(maxn,sum);
  }
  cout<<maxn;
}

问题 D: 17倍时间限制: 1 Sec 内存限制: 128 MB
提交: 458 解决: 55
题目描述学习程序设计的Lanlan记得老师给她布置的第一个任务是:输入一个数N,然后输出17N的值。当然这个任务非常简单,经过一段时间的学习,兰兰有了一些的进步,老师又布置了一个类似的任务,只是变更了一个条件,输入的N是一个二进制数,输出的值也要是二进制表示的。
现在请帮助Lanlan完成这个任务。
输入一个二进制表示的数N。
输出二进制表示的17
N。
样例输入复制样例数据
10110111
样例输出110000100111
提示10110111相当于十进制的183,于是183*17=3111,二进制形式是110000100111。
30%的数据N的位数小于25位
50%的数据N的位数小于50位
100%的数据N的位数小于1000位

#include<stdio.h>
#include<string.h>
#include<math.h>
int b[1000000];
int main()
{
 long long int d,i,n,sum=0;
 char a[1000];
 scanf("%s",&a);
 n=strlen(a);
 d=n;
 for(i=0;i<n;i++)
 {
  sum=sum+pow(2,d-1)*(a[i]-48);
   d--;
 }
 sum=sum*17;
 i=0;
 while(sum>0)
 {
  b[i]=sum%2;
  i=i+1;
  sum=sum/2;
 }
 for(i--;i>=0;i--)
  printf("%d",b[i]);
 printf("\n");
 return 0;
}
没通过,因为N是1000,所以可能最后数值很大,即使long long 也不行,但不知道为什么,这个适合小数据的

问题 E: 约数国王时间限制: 1 Sec 内存限制: 128 MB
提交: 86 解决: 6
题目描述
数学的王国里,有一些约数国王……约数国王的定义是这样的:一个大于1的整数n,如果它约数的个数比1~n-1的每个整数的约数的个数都要多,那么我们就称它为约数国王。聪明的小明在奥数书上认识了它们,于是产生了一个问题:他想知道L到R之间一共有多少个约数国王?它们分别又是谁?
输入只有一行,包含一个l,一个r,表示小明想知道的范围。
输出只有一行,第一个数h,表示l~r内一共有多少个约数国王,接下来h个从小到大的数(为了防止国王们打架,你需要按顺序输出。),表示约数国王分别是谁。
样例输入复制样例数据
1 100
样例输出8 2 4 6 12 24 36 48 60
提示对于30%的数据,1<=l<=r<=200000。
对于50%的数据,1<=l<=r<=500000。
对于70%的数据,保证最大的约数国王的约数的个数不大于1000。
对于100%的数据,1<=l<=r, 并且保证l,r在64位整型以内,最大的约数国王的约数的个数不大于200000。

目前暂时解决不了

问题 F: 移动石子时间限制: 1 Sec 内存限制: 128 MB
提交: 259 解决: 156
题目描述
期待已久的“清明”假期终于到了。清明节是中华民族几千年来留下的优良传统,它有利于弘扬孝道亲情,唤醒家庭共同记忆,促进家庭成员乃至民族的凝聚力和认同感。
小学生卡卡西非常高兴,因为清明前后正是踏青的好时光,他终于可以和小伙伴们一起出去踏青了!然而,天公不作美,假期的第一天就下起了雨,卡卡西只能放弃出游计划,待在家里。
期间,无聊的卡卡西和小伙伴玩了一个博弈游戏:
在一个给定的 n×n 的棋盘上,有一个石头被放在棋盘的左上角。他们轮流移动石头。每一回合,每个人只能把石头向上,下,左,右四个方向移动一格,并且要求移动到的格子之前不能被访问过。谁不能移动石头了就算输。假如小卡卡西先移动石头,而且两人都以最优策略走步,问最后谁能赢?
输入输入有多组数据。
输入第一行包含一个整数n,表示棋盘的规模。
当输入n为0时,表示输入结束。
输出对于每组数据,如果小卡卡西最后能赢,则输出“Kakashi”,否则输出“Lost”,每一组答案独占一行。
样例输入复制样例数据
2
0
样例输出Kakashi
提示对于20%的数据,保证1<=n<=10;
对于40%的数据,保证1<=n<=1000;
对于所有的数据,保证1<=n<=10000。

#include<stdio.h>
int main()
{
 int n;
 while(scanf("%d",&n)!=EOF)
 {
  if(n==0)
   break;
  if(n%2==0)
   printf("Kakashi\n");
  else
   printf("Lost\n");
 }
 return 0;
}
这个题目就是奇数就会输,偶数就会赢

问题 G: 列车线路
题目描述
终于,卡卡西来到了一个叫“比特兰”的国家,“比特兰”是个很发达的国家,有着非常高科技的列车,和非常复杂的列车线路。具体来说,从理论上,我们可以假设这个国家的高科技列车可以不消耗时间的从A地瞬间转移到B地。同时,铁路线路复杂到,每对城市之间都有列车连接。但是不幸的是,由于这种列车运行需要很多维护工作,所以每天只能发出一次。从i到j的列车(i≠j)会在ti,j时间发出(保证ti,j两两不同)。
如果有一条路径链接A和B两个城市,并且满足路径上的每⼀条边的发车时间单调递增(也就是说经过的每段铁路的发出时间都要大于上一段的,因为我们需要从上一段铁路换乘下一段铁路)。现在“比特兰”的铁路局想要知道,一天之内,对于每一对i和j,如果想要从i到达j,最早多早能到达呢?
输入
第一行一个整数n。
接下来n行,每行n个整数。表示ti,j。(i=j时保证ti,j=0,不算一条线路)
输出
n行,每行n个整数ansi,j,表示从i到j最早的到达时间。(i=j的时候ansi,j=0)
样例输入
复制样例数据 3
0 4 5
2 0 3
1 6 0
样例输出
0 4 5
2 0 3
1 4 0
提示
对于20%的数据,n<=10
对于40%的数据,n<=20
对于60%的数据,n<=50
对于100%的数据,n<=500,ti,j<=109

目前暂时解决不了

问题 H: 搭积木时间限制: 1 Sec 内存限制: 128 MB
提交: 14 解决: 4
题目描述
积木对于大家来说应该很熟悉,我们可以用积木搭建出各种各样的模型,不同的人搭建出来的模型也会不一样。这不,小卡卡西正在和一群小伙伴玩积木呢!
铁人老师看见小朋友们在玩积木,就给大家出了一个难题:
给定一些方形的积木,积木的三维尺寸分别为正整数Xi,Yi,Zi,每一种积木
都可以认为是无限多个。并且在搭建过程中约定如下条件:
1.搭建的模型每一层只能用一个积木;
2.模型的每一层的积木的底面必须小于它的下层,当然积木的底面可以是6个面中的任一个。
那么要如何搭建,才能使模型最高呢?
输入第一行一个数N,表示不同积木的种数(N<=1000)
以下N行,每一行描述一种积木。
Xi、Yi、Zi(<=100)分别为三边的长度
输出一行一个数M,表示在给定的条件下能搭建的最高模型的高度。
样例输入复制样例数据
1
10 20 30
样例输出40

目前暂时解决不了

问题 I: 幸运数字III时间限制: 1 Sec 内存限制: 128 MB
提交: 639 解决: 221
题目描述
小李非常喜欢数字4和7,看到一个数字他就想快速计算出因子里面分别有几个4和7,但是智商捉急的他总是要算很久,喜欢编程的你能够帮助他吗?
输入第一行一个整数n(3<=n<=2^60),表示给定的数字。
输出两个用空格隔开的数字,分别表示给定数字的因子中4和7的个数。
样例输入复制样例数据
112
样例输出2 1
提示112=447

#include<stdio.h>
int main()
{
 long long int n,a[2]={0};
 scanf("%lld",&n);
 while(1)
 {
  if(n%4==0)
  {
   a[0]++;
   n=n/4;
  }
  else
   break;
 }
 while(1)
 {
  if(n%7==0)
  {
   a[1]++;
   n=n/7;
  }
  else
   break;
 }
 printf("%lld ",a[0]);
    printf("%lld\n",a[1]);
 return 0;
}

5779: 英雄卡时间限制: 1 Sec 内存限制: 128 MB
提交: 776 解决: 136
题目描述
小李非常迷恋收集各种干脆面里面的英雄卡,为此他曾经连续一个月都只吃干脆面这一种零食,但是有些稀有英雄卡真的是太难收集到了。后来某商场搞了一次英雄卡兑换活动,只要你有三张编号连续的英雄卡,你就可以换任意编号的英雄卡。小李想知道他最多可以换到几张英雄卡(新换来的英雄卡不可以再次兑换)。
输入第一行,共一个整数n(1<=n<=10000),表示小李拥有的英雄卡数。
第二行,共n个空格隔开的数字ai(1<=ai<=100000),表示英雄卡的编号。
输出输出仅有一行,共1个整数,表示小李最多可以换到的英雄卡。
样例输入复制样例数据
6
3 1 2 4 4 5
样例输出1
提示1 2 3三张编号连续,可以换一张,换完后剩下4 4 5,不符合兑换规则,无法继续兑换。

#include<stdio.h>
int a[100000];
int main()
{
 int n,i,t,sum=0;
 int x,y,z,max;
 scanf("%d",&n);
 for(i=0;i<n;i++)
 {
  scanf("%d",&t);
  a[t]++;
 }
 for(i=0;i<n;i++)
 {
  if(a[i]!=0&&a[i+1]!=0&&a[i+2]!=0)
  {
   x=a[i];y=a[i+1];z=a[i+2];
            max=x;
      if(max>y)
     max=y;
   if(max>z)
     max=z;
   sum=sum+max;
   a[i+2]-=max;
   a[i+1]-=max;
   a[i]-=max;
  }
 }
 printf("%d\n",sum);
 return 0;
}

贵有恒,何必三更起五更眠;最无益,莫过一日曝十日寒。
问题 K: 最强阵容时间限制: 1 Sec 内存限制: 128 MB
提交: 383 解决: 95
题目描述
拿着新换来的英雄卡,小李满心欢喜的准备和同学们PK一下。
他们的游戏规则非常简单,双方把自己的牌绕成一圈,然后指定一个起点,从该张牌开始顺时针方向往后取,谁取出的字符串字典序更小(从左到右开始比较,碰到第一个不一样的字符进行比较,比较规则为a<b<…<z)谁将获得胜利。具体规则可参考样例。虽然现在小李的牌已经很好了,但是你能不能帮他快速算出起始位置,使得他能够派出最强阵容。
输入第一行n(1<=n<=30000),表示共有n张牌。
第二行共n个用一个空格隔开的小写字母,表示给定的一圈牌起始序列。
输出仅一个整数,能获得最小字典序字符串的起点位置。如果有多个位置开始的字符串一样,则输出最小的那个位置,且第一个位置从1开始。
样例输入复制样例数据
4
b c a b
样例输出3
提示四个位置取出的字符串分别为bcab,cabb,abbc,bbca,显然最小位置是3。

待续

问题 L: 最强素数时间限制: 1 Sec 内存限制: 128 MB
提交: 193 解决: 49
题目描述小李在你帮助之下轻松战胜了他的同学们,于是满怀恶意的同学出了一个题目来为难小李,作为小李神一样的队友,你又要出力了。
素数41能写成连续6个素数之和:41=2+3+5+7+11+13。
现在要求n以内的素数中,能表示为最多连续素数之和的那个数,如果有多个答案,请输出最大的那个素数。
输入仅一行,一个整数n(1<=n<=1000000)。
输出输出就一个整数,为所求的能表示为最多连续素数和的那个素数。
样例输入复制样例数据
100
样例输出41
提示41=2+3+5+7+11+13

待续

猜你喜欢

转载自blog.csdn.net/qq_43552147/article/details/84960187