第1题 礼物
国庆马上要到了。小明喜欢的礼物有n种分别是:公仔、电子手表、漫画书等。每种礼物有一件,每种礼物价钱都不一样。小明手头上有 m 元。小明最多可以买多少件礼物?
输入格式
第一行,两个整数:n m 1 <= n<=100,1<=m<= 100000。
第二行,n个空格分开的整数(每个整数<=1000),代表每种礼物的价钱。
输出格式
一个整数,小明能买多少件礼物
输入/输出例子1
输入:
3 100
40 70 50
输出:
2
#include<bits/stdc++.h>
using namespace std;
long long n,m,ans;
long long a[114514];
int main (){
cin>>n>>m;
for (int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1);
for (int i=1;i<=n;i++) {
m -= a[i];
if (m<0) {
break;
}
ans++;
}
cout<<ans;
return 0;
}
第2题 蜡烛
奶牛bessie有n根蜡烛,第i根蜡烛的长度是h[i]. bessie最近刚上完小学,只会加减法。它想知道它的n根蜡烛最多能用多少个晚上。由于bessie比较胆小,因此它第一个晚上只点燃一根蜡烛,第二个晚上点燃两根蜡烛,第三个晚上点燃三根蜡烛…第i个晚上它必须要点燃i根蜡烛。每根被点燃的蜡烛,它燃烧一个晚上会使得它的长度减少1。一旦蜡烛的长度变成0,那么该根蜡烛就用完了。如果第i个晚上bessie发现不够i根蜡烛用了,那么bessie就会睡不着。 Bessie想知道,它该如何选择每个晚上点燃哪些蜡烛,可以使得它的n根蜡烛能用尽量多的晚上。输出最多能用多少个晚上。
输入格式
第一行:一个整数n, 1 <= n <= 50.
第二行:n个整数,第i个整数表示第i根蜡烛的长度h[i]. 1 <= h[i] <= 100.
输出格式
一个整数,总共最多能用多少个晚上。
输入/输出例子1
输入:
3
2 2 2
输出:
3
#include<bits/stdc++.h>
using namespace std;
int a[105],n,m,ans,sum;
bool cmp(int x,int y){
return x>y;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
sort(a+1,a+n+1,cmp);
for(int j=1;j<=i;j++){
if(a[j]<=0){
cout<<i-1;
return 0;
}
a[j]--;
}
}
cout<<n;
return 0;
}
第3题 数字圈
当我们写数字时会发现有些数字有封闭区域, 有的数字没有封闭区域。 数字 0 有一个封闭区域, 数字 1、 2、3 都没有封闭区域, 数字 4 有一个封闭区域, 数字 5 没有封闭区域, 数字 6 有一个封闭区域, 数字 7 没有
封闭区域, 数字 8 有两个封闭区域, 数字 9 有一个封闭区域。
现在你要构造一个最小的非负整数, 使得它的各位数字的封闭区域的数量加起来的总和恰好等于 K。
输入格式
一个整数 K。 1 <= K <= 2500。
输出格式
满足题意的最小的非负整数。
输入/输出例子1
输入:
1
输出:
0
输入/输出例子2
输入:
2
输出:
8
输入/输出例子3
输入:
40
输出:
88888888888888888888
#include<bits/stdc++.h>
using namespace std;
long long k;
int main(){
cin>>k;
if (k==1)
{
cout<<0;
return 0;
}
for (int i=1;i<=k%2;i++)
cout<<4;
for (int i=1;i<=k/2;i++)
cout<<8;
return 0;
}
第4题 书架
为了方便同学们查阅资料,程序设计兴趣小组的辅导老师打算将积攒了很多年的n本书放到上课教室的书架上去。
教室的书架是一层一层叠起来的,每一层最多可以放m本书。每一层的高度由放在这层中最高的那本书决定的,如果不放书,则认为这层的高度为0。为了使每个同学能方便地拿到想要的书,书架的总高度应尽可能低。请编程计算将这n本书放在书架上后书架的最小总高度,计算的过程中不考虑书的厚度与书架本身材料的厚度。
输入格式
输入共n+1行。
第1行2个整数n和m (1≤m≤n≤100000) 。
接下来n行,每行1个正整数,分别表示每本书的高度(每本书的高度不超过100)。
输出格式
输出共1行,表示将n本书放入书架后书架的最小总高度。
输入/输出例子1
输入:
3 2
20 10 30
输出:
40
#include<bits/stdc++.h>
using namespace std;
bool cmp(int x,int y)
{
return x>y;
}
int n,m,a[1000000],s=0;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i+=m)
s+=a[i];
cout<<s;
return 0;
}
第5题 最大步数
给出了两个非负整数 P 和 Q。您的任务是使得 P 和 Q 相等。在每一步中,您可以执行以
下两项操作之一:
1、将任何质数加到 P 上。
2、从 Q 减去任何质数。
如果不可能使 P 和 Q 相等,则输出-1。否则,输出一个非负整数:可以执行的最大步数。
输入格式
一行,两个整数 P 和 Q。 0 <= P,Q <= 10^18
输出格式
一个整数
输入/输出例子1
输入:
5 9
输出:
2
输入/输出例子2
输入:
5 10
输出:
2
输入/输出例子3
输入:
5 6
输出:
-1
#include<bits/stdc++.h>
using namespace std;
long long p,q;
int main(){
cin>>p>>q;
if (p>q || q-p==1) cout<<-1;
else cout<<(q-p)/2;
return 0;
}
第6题 购书
书店稿促销优惠活动:“买 3 本免费 1 本”。即如果你买 3 本书,价格最便宜的那本书就不收钱。如果买很多书, 不同分组优惠的价格可能不同。比如,买 7 本书,价格分别是:10,3,2,4,6,4,9。 如果分组是: (10,3,2),(4,6,4)和(9),第一组免费价格 2,第二组免费价格 4,第三组不能免费。
现在,你买了 N 本书,请恰当分组(每组 1 本到 3 本),使得花费最少?
输入格式
第一行包含 1 个整数 N, 1≤N≤100000。
下面 N 行,每行 1 个整数 Ci 表示一本书的价格。 1≤ Ci ≤ 100000。
输出格式
一个整数,最少付款是多少。
输入/输出例子1
输入:
4
3 2 3 2
输出:
8
输入/输出例子2
输入:
6
6 4 5 5 5 5
输出:
21
#include<bits/stdc++.h>
using namespace std;
long long n,ans;
long long price[114514];
bool cmp(long long x,long long y) {
return x>y;
}
int main(){
cin>>n;
for (int i=1;i<=n;i++) {
cin>>price[i];
ans += price[i];
}
sort(price+1,price+n+1,cmp);
for (int i=3;i<=n;i+=3) {
ans -= price[i];
}
cout<<ans;
return 0;
}
第7题 学生分组
有N组学生,给出初始时每组中的学生个数,再给出每组学生人数的上界R和下界L(L<=R),每次你可以在某组中选出一个学生把他安排到另外一组中,问最少要多少次才可以使N组学生的人数都在[L,R]中。
输入格式
第一行一个整数N,表示学生组数; n<=100
第二行N个整数,表示每组的学生个数;<=100
第三行两个整数 L,R,表示下界和上界
输出格式
一个数,表示最少的交换次数,如果不能满足题目条件输出-1
输入/输出例子1
输入:
2
10 20
10 15
输出:
5
#include<bits/stdc++.h>
using namespace std;
long long n,s,l,r,L,R,ans;
long long a[105];
int main(){
cin>>n;
for (int i=1;i<=n;i++) {
cin>>a[i];
s += a[i];
}
cin>>l>>r;
if (s>r*n || s<l*n) {
cout<<-1;
return 0;
}
for (int i=1;i<=n;i++) {
if (a[i]<l) {
L += l-a[i];
}
if (a[i]>r) {
R += a[i]-r;
}
}
ans = max(L,R);
cout<<ans;
return 0;
}
第8题 渡河
总共有 X 人要坐船过河。
一个小船最多可以坐 4 人,一个小船固定收费 32 元。
一个大船最多可以坐 6 人,一个大船固定收费 36 元。
码头有无穷多小船和大船。问如何坐船,才能使得总费用最小。
输入格式
一个整数 X。
输出格式
一个整数,表示最小的总费用。
输入/输出例子1
输入:
4
输出:
32
输入/输出例子2
输入:
12
输出:
72
样例解释
60%的数据, 1 <= X <= 1000
80%的数据, 1 <= X <= 1000000
100 的数据, 1 <= X <= 2000000000
#include<bits/stdc++.h>
using namespace std;
long long x,s=0,ans;
int main(){
cin>>x;
ans = x/6*36;
if (x<=4) cout<<32;
else {
if (x%6==1 || x%6==2) ans = ans-36+32*2;
if (x%6==3 || x%6==4) ans += 32;
if (x%6==5) ans += 36;
cout<<ans;
}
return 0;
}