2019寒假集训第五场(新生场)

问题 A: 水题大战
时间限制: 1 Sec 内存限制: 128 MB
目描述小Q最近正在给一个比赛出题目,他认为第一题应该是老少皆宜的。于是,他出了一个题目,然后让n个人来评价这个题目。

每个人会对这个题目做出评价,有难和简单两种,1表示难,0表示简单。如果所有人都认为这个题目简单,那么这个题目就是简单的,否则这个题目就是难的。

输入输入第一行是一个正整数T,表示数据的组数。

接下来对于每组数据,先输入一个正整数n,表示参与评价的人的数量,接下来一行有n个整数,每个整数都是0或者1,表示对当前题目的评价。

输出输出共T行,每行一个答案。如果该题简单,就输出EASY,否则输出HARD。
样例输入复制样例数据

2
3
0 0 1
1
0
样例输出HARD
EASY

提示样例共有2组数据:

第一组数据n是3,2个人认为是简单,1个人认为是难,所以是HARD。

第二组数据n是1,这唯一的一个人认为是简单的,所以是EASY。

对于40%的数据,T=1,1≤n≤5。

对于100%的数据,1≤T≤10,1≤n≤100。

#include<stdio.h>
int main()
{
 int t,n,a[100],i,j,b[10];
 scanf("%d",&t);
 for(i=0;i<t;i++)
 {
  scanf("%d",&n);
  for(j=0;j<n;j++)
  scanf("%d",&a[j]);
  for(j=0;j<n;j++)
  if(a[j]!=0)
  break;
  if(j==n)
  b[i]=0;
  else
  b[i]=1;
 }
 for(i=0;i<t;i++)
 if(b[i]==0)
 printf("EASY\n");
 else
 printf("HARD\n");
 return 0;
}

问题 B: 学生分组
时间限制: 1 Sec 内存限制: 128 MB
目描述在小Q的大学里,有n个学生,其中n一定是偶数。每个学生有一定的编程能力,第i个学生的能力是ai。

学校里的老师希望把学生组成n/2个队伍, 每个队伍里面有2个学生,每个学生只能属于一个队伍。两个学生可以组队,当且仅当他们的能力是相同的,否则他们就不能理解对方。

由于开始的时候, 学生的能力参差不齐,可能无法顺利组队。但是学生可以通过做题来提高自己的能力,每做一题,能力就可以提高1 。

学校的老师希望计算出这些学生最少需要做多少题,才能顺利的组队。

输入输入的第一行是一个正整数n,表示学生的数量,保证n一定是偶数。

接下来一行有n个正整数,第i个整数ai表示第i个学生当前的编程能力。

输出输出只有一行一个整数,表示所有学生最少需要做的总题数,才能使得顺利组队。
样例输入复制样例数据

6
5 10 2 3 14 5
样例输出5

提示样例中,第3个人和第4个人组队,第1个人和第6个人组队,第2个人和第5个人组队,然后第3个人做1题,第2个人做4题,总共做5题,他们就能顺利组队了。

对于50%的数据,1≤n≤1000,所有学生的能力最多只有2种不同的取值。

对于100%的数据,1≤n≤100000,1≤ai≤100。

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
 int n,i,j,t,sum=0,a[100000];
 cin>>n;
 for(i=0;i<n;i++)
 cin>>a[i];
 sort(a,a+n);
 for(i=0;i<n;i=i+2)
 {
  sum+=abs(a[i]-a[i+1]);
 }
 cout<<sum<<endl;
 return 0; 
}

问题 C: 变换高度时间限制: 1 Sec 内存限制: 128 MB
题目描述小Q是一个牛逼的少年,他段近无聊的在纸上画了n个塔.第i个塔的高度是hi。他会对塔进行一种操作,操作定义为在某个高度H的时候,如果第i个塔的高度高于H,我们必须把这个培的高度变成H. 这样一次操作的代价是从所有塔里面移除的1×1方块的总和。如果一次操作的代价小于等于k,那么我们就称这个操作为友好操作(k≥n)。

现在请你计算最少需要多少次友好操作,才能使得所有的塔的高度都变成相同。显然,这个肯定有答案.下面图可以参考(样例1 ) :

在这里插入图片描述

输入输入第-行是两个整数n和k, 表示塔的数量和操作相关的系数k。

第二行有n个空格隔开的整数h1,h2,…hn。

输出输出只有一个整数,表示最少需要的友好操作的数量,使得每个塔的高度都相同。
样例输入复制样例数据

5 5
3 1 2 2 4
样例输出2

提示样例如图所示,需要2个友好操作,第1次设定H为2,代价为3,第2次设定H为1,代价为4。

对于50%的数据,1≤n≤2000,hi≤2000。

对于100%的数据,1≤n≤2×105,n≤k≤109,hi≤2×105。

待续

问题 D: 统计序列
时间限制: 1 Sec 内存限制: 128 MB
目描述有一天, 小Q想起了一个统计公式, 定义一个长度为m的序列,我们可以得到V,V的计算如下:

在这里插入图片描述

其中:

在这里插入图片描述

现在给你n个整数,需要从中选出m个数,使得他们构成的序列的V值最小。

为了方便,你只需要输出最小的V值乘以m2的值,可以证明这是一个整数。

输入输入第一行两个正整数n和m。接下来n行,每行一个正整数,表示给你的n个数。
输出输出一个整数表示答案,保证答案不超过int64.
样例输入复制样例数据

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

提示比如选择了1,2,3这3个数,平均数是2,所以V值是在这里插入图片描述,乘上m2后就变成了6。

对于20%的数据,1≤m≤n≤10。

对于50%的数据,1≤m≤n≤1000。

待续

问题 E: 统计字数
时间限制: 1 Sec 内存限制: 128 MB
目描述大家都知道Word是一个强大的文字处理软件,具有丰富的字数统计功能。

在这里插入图片描述

小明听说你学习了程序设计,想请你帮他制作一个简易统计字数的软件,现在给定小明书写的一段文字,请你统计出文字中,英文字母数量,数字字符数量。

输入第一行包含一个字符串包含英文字母和数字,以及一些常见标点符号,不包含中文。
输出两个整数,中间用空格分隔,分别表示英文字母数量和数字字符数量。
样例输入复制样例数据

2018YuyaoProgrammingContest.
样例输出23 4

提示对于60%的数据,这段文字中的长度不超过200。

对于100%的数据,文字长度不超过1000。

另有50%的数据,不包含空格字符。

#include<stdio.h>
#include<string.h>
int main()
{
 char a[1000];
 int n,i,sum1=0,sum2=0;
 gets(a);
 n=strlen(a);
 for(i=0;i<n;i++)
 {
  if(a[i]>='0'&&a[i]<='9')
  sum1++;
  if(a[i]>='A'&&a[i]<='Z'||a[i]>='a'&&a[i]<='z')
  sum2++;
 }
 printf("%d %d\n",sum2,sum1);
 return 0;
 } 

问题 F: 整数拆分
时间限制: 1 Sec 内存限制: 128 MB
目描述小明最近在学习整数拆分,他在草稿纸上随手写下了一串数字,仅包含“0”~“9”这十种数字,长度不超过9。

现在你可以在这串数字中选出任意一个子串(不能为空,可以是原串),不能以数字“0”开始。小明想要知道,这些可能的子串构成的数,有多少个比他心目中的幸运数字x更大。

注:子串只要在原串中的起始或者终止位置不同,就认为是不同的子串;子串和x都是十进制的。

输入第一行输入一个数字串S,仅包含数字“0”~“9”这十种数字,长度不超过9。

第二行包含一个整数x,表示小明的幸运数字。
输出有多少个非“0”开始的子串,表示成十进制数后比x更大。
样例输入复制样例数据

1023
12
样例输出3

提示子串“23”、“102”和子串“1023”,都要比12更大。

对于50%的数据,S的第一个字母不超过“2”。

对于100%的数据,S仅包含数字“0”~“9”这十种数字,1<=S的长度<=9;0<=x<=777444111。

#include<stdio.h>
#include<string.h>
int main()
{
 char a[10];
 int n,t,i,j,sum=0,p;
 gets(a);
 scanf("%d",&n);
 t=strlen(a);
 for(i=0;i<t;i++)
 {
  p=0;
  if(a[i]=='0')
  continue;
  for(j=i;j<t;j++)
  {
   p=p*10+(a[j]-48);
   if(p>n)
   sum++; 
  }
 }
 printf("%d\n",sum);
 return 0; 
}
这个思路是对的,但是没通过,样题过了,就是枚举

问题 G: 真假鉴定
时间限制: 1 Sec 内存限制: 128 MB
目描述有n堆硬币依次排列,每一堆有a_i个。每堆硬币全是真币或全是假币,真币每个重5克,假币每个重4克。你有一台电子天平,可以从每堆硬币中挑出若干个进行一次称量(也可以一个都不选)。现在你想要知道,若要确定前1,2,……,n堆硬币的真假,至少要称量几次。
输入第一行一个整数n,表示硬币的堆数。

接下来一行n个整数a_i,表示每堆硬币的数量。

输出n行,每行一个整数,第i行表示想要确定前i堆硬币的真假至少要称量几次。
样例输入复制样例数据

3
2 3 4
样例输出1
1
1

提示

对于10%的数据,n≤1

对于30%的数据,n≤2

对于60%的数据,n≤100

对于80%的数据,n≤1000

对于100%的数据,n≤105,a_i≤109

存在10%的数据,a_i=1

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

问题 H: 最大公约数
时间限制: 1 Sec 内存限制: 128 MB
目描述给定n个正整数,a_1,a_2,…,a_n,求最少删去几个数,使得删去后这些数的最大公约数比原先的所有数的最大公约数大。
输入第一行一个整数n,第二行n个正整数,a_1,a_2,…,a_n。
输出一个数,表示最少删去的个数,若无论怎么删都不会比原来的大,输出-1。
样例输入复制样例数据

3
1 2 4
样例输出1

提示删去1这个数,最大公约数从1变到2。

对于30%的数据,n<=15

对于50%的数据,n,a_i<=1000

对于100%的数据,n<=300,000,a_i<=1.5*10^7

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值