快递费(fee)- 2023庐阳小学T1
题目描述
东风快递公司收费标准:首重12元/KG,续重2元/KG。举例:包裹重量为3公斤,快递费为12+2+2=16(元),已知包裹的重量,求快递费用。
输入格式
输入文件名:fee.in
一个正整数,表示包裹的重量
输出格式
输出文件名:fee.out
一个正整数,该包裹的快递费用。
输入输出样例
输入样例1:
3
输出样例1:
16
说明
【数据范围】
包裹的重量<=1000
知识点:算术运算
代码:
#include<iostream>
using namespace std;
int main(){
long long sum=0,n;
cin>>n;
if(n>1) sum+=(n-1)*2+12;
else if(n==1) sum+=12;
cout<<sum;
return 0;
}
采伐(wood)- 2023庐阳小学T2
题目描述
为了保护森林,要求采伐作业的时候不能将一棵树从根部锯掉,而是留下一部分,因为这样这棵树可以继续生长。伐木工将其伐木设备的锯片设置为一定高度,这样可以锯掉一棵树这个高度之上的部分。求总计可以得到多少长度的木材。
输入格式
输入文件名: wood.in
共两行:
第一行,两个数N和H,N表示树林中树木的数量,H表示伐木设备的锯片设置的高度;
第二行,N 个整数,表示每棵树的高度,高度不超过10^9。
输出格式
输出文件名:wood.out
一个整数,表示总计可以得到木材的长度。
输入输出样例
输入样例1:
4 10 11 10 9 12输出样例1:
3说明
【数据范围】
N<=10000
H<=1000000
【耗时限制】1000ms 【内存限制】256MB
知识点:枚举算法
代码:
#include<iostream>
#include<map>
#include<algorithm>
#include<cmath>
#include<stack>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<sstream>
#include<set>
using namespace std;
int main(){
long long n,h,sum=0;
cin>>n>>h;
for(int i=1;i<=n;i++){
int x;
cin>>x;
if(x>h){
sum+=(x-h);
}
}
cout<<sum;
return 0;
}
升降机(lift)- 2023庐阳小学T3
题目描述
升降机是建筑施工中经常使用的载人施工机械。当前升降机在一楼,有N个工人走进了升降机,他们有着各自的目标楼层,升降机的门已经关闭。升降机上升一层需要6s,下降一层需要4秒只有到达工人要去的楼层,升降机的门才需要开关一次,开门需要2秒,关门需要3秒,每下一个人需要1秒。求升降机从一楼将N个人送至各自要去的楼层,并且返回一楼,总共需要的时间。
输入格式
输入文件名:lift.in
两行。
第一行,一个正整数N表示共有N个工人。
第二行,N个非1的正整数,表示N个工人各自目标楼层
输出格式
输入文件名:lift.out
一个整数,表示升降机从一楼将N个人送至各自要去的楼层,并且返回一楼,总共需要的时间。
输入输出样例
输入样例1:
4 2 5 2 4输出样例1:
59说明
【样例1解释】
(6+2+3+1+1)+(6+6+2+3+1)+(6+2+3+1)+4+4+4+4=59
【数据范围】
1<=N<=100000,楼层数不超过 10^9。
知识点:数组,简单排序
代码:
#include<iostream>
#include<map>
#include<algorithm>
#include<cmath>
#include<stack>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<sstream>
#include<set>
using namespace std;
long long a[100010];
int main(){
int n,p=1,cnt=1;
long long t=0;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+1+n);
a[n+1]=-1;
for(int i=1;i<=n;i++){
if(a[i]==a[i+1]) cnt++;
else{
t+=(a[i]-p)*6+2+cnt*1+3;
cnt=1;p=a[i];
}
}
t+=(a[n]-1)*4;
cout<<t;
return 0;
}
栈道(way)- 2023庐阳小学T4
题目描述
光头强打算从山脚到山顶修一条栈道,让游人可以拾阶而上。为了保证栈道不过于陡峭下一步台阶不能高于当前台阶一个单位的高度,当然下一个台阶同当前台阶持平是允许的。按照位置给出地形高度,希望可以选择最多的支点修建栈道,这样栈道更为稳定。那些没有被选择的点,可以实施魔法,让其消失。求修建这样的栈道最多可以选择多少个支点?
输入格式
输入文件名:way.in
第一行,一个整数N。
第二行,N个非负整数(<=1000000)。
输出格式
输出文件名:way.out
一个整数,意义如题所述,修建这样的栈道最多可以选择支点数。
输入输出样例
输入样例1:
10 1 6 2 9 2 8 3 7 4 5输出样例1:
6说明
【数据范围】
N<=3000
知识点:线性DP
代码:
#include<iostream>
#include<map>
#include<algorithm>
#include<cmath>
#include<stack>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<sstream>
#include<set>
using namespace std;
int dp[3010],a[3010],ans;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
dp[i]=1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=i-1;j++){
if(a[i]>=a[j]&&a[i]-a[j]<=1){
dp[i]=max(dp[j]+1,dp[i]);
}
}
ans=max(ans,dp[i]);
}
cout<<ans;
return 0;
}
马拉松(marathon)- 2023庐阳小学T5
题目描述
环湖马拉松全程 L 公里,已经安排了 N 个补给点,位置已经确定。由于预算增加,现在可以增设 K 个补给点。如何安排新增的补给点使得相邻补给点间最大距离最小。相邻补给点间距离也包括起点与第一个补给点之间的距离和最后一个补给点与终点之间的距离。
输入格式
输入文件名:marathon.in
第一行包括 3 个整数 L,N,K,分别表示马拉松全程长度、原有补给点的数量以及最多可以增设的补给点的数量。
第二行,N 个整数,表示原有的 N 个补给点的位置。补给点的位置用距离起点的距离表示,取值范围 (0,L)。
输出格式
输出文件名:marathon.out
一个整数,意义如题所述,表示相邻补给点间最大距离最小值。
输入输出样例
输入样例1:
100 2 1 70 30输出样例1:
30说明
【数据范围】
0<N≤100000
0≤L≤2000000000
0≤K≤2000000000
【耗时限制】1000ms
【内存限制】256MB
代码:
#include<iostream>
#include<map>
#include<algorithm>
#include<cmath>
#include<stack>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<sstream>
#include<set>
using namespace std;
int L,n,k,a[100010];
bool check(int x){
int sum=0;
for(int i=1;i<=n+1;i++){
sum+=(a[i]-a[i-1])/x;
if((a[i]-a[i-1])%x==0) sum--;
}
return sum<=k;
}
int low(int l,int r){
while(l<r){
int mid=(l+r)/2;
if(check(mid)) r=mid;
else l=mid+1;
}
return l;
}
int main(){
cin>>L>>n>>k;
for(long long i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n);
a[n+1]=L;
cout<<low(1,L+1);
return 0;
}