元旦快到了,小W的班级准备举办元旦庆祝活动,小W和几个同学一起帮助班主任老师进行准备。小W带着几个同学乘坐出租车去买东西。在出租车上,他们向司机师傅了解到出租车计价方案为:2.5公里以内起步价是6元,超过2.5公里之后按1.2元/公里计价,超过10公里之后在1.2元/公里的基础上加价50%,另外,停车等候时间则按时间计费后加入总价:1元/5分(注:不满5分钟不计费)。好奇的小W想自己先估算一下大概要多少费用。已知:小W等人乘坐出租车路程为N公里,中间停车等候时间总共M分钟,请计算小W应付的出租车费用是多少元?
输入文件共有一行,包含两个整数N,M,分别表示出租车行驶的里程和中间停车的时间,中间以空格分开,0≤N≤200,0≤M≤60。
输出仅包含一个整数,表示小W应付的乘车费用,四舍五入到整数元。
8 7
14
解析
考点:分段费用问题
参考代码:
#include
using namespace std;
int main(){
int n,m;
double s=0;
cin>>n>>m;
if(n<=2.5) s=6+m/5;
else if(n<=10) s=6+(n-2.5)*1.2+m/5;
else s=15+(n-10)*1.8+m/5;
cout<<(int)(s+0.5);
return 0;
}
为了给同学们营造一个良好的学习环境和方便学校的管理,市政府准备对小W就读的学校进行重新规划,占地面积将再次扩大。学校通过领导会议决定,重建学校的围墙。由于学校太大,重建围墙也不是一件小项目,学校决定请专门的建筑公司来建筑。
许多建筑公司从网上得知这个消息后,纷纷来到学校,找到学校领导,对自己公司进行介绍,并希望能接下这个项目。学校领导对很多家公司印象都还不错,难以取舍,为了公平,学校决定通过竞标决定把这个项目交给哪家公司负责。这次竞标是由学校自主决定的,不但要注重建筑实力,而且还要看建筑公司是否有足够的智慧。
学校通过两轮选拔。第一轮,选出建筑实力较强的公司。进入第二轮后,由学校专门负责这个项目的领导进行智力考核。
领导说:为了美观,我们准备建设一面2米高的围墙,围墙建好后,墙外要贴上有图画的瓷砖,当然这就需要瓷砖越大越美观了。目前市面用的最大瓷砖是多大?
公司:宽1米,长2米的
领导:哦,我们就用这种吧,我们学校需建筑N米长的围墙,如果用这种瓷砖来贴,总共有多少种贴法呢?
公司:…………….(正在计算中……………)
输入文件为一个数N(1
对于20%的数据,2
对于60%的数据,2
对于100%的数据,2< N<10000。
输出一个数,表示如果用宽1米、长2米,贴在高2米,长N米的围墙上,最多有多少种贴法?(输出数据后需换行)
【样例输入1】 4
【样例输入2】 6
【样例输出1】 5
【样例输出2】 13
解析
考点:递推+高精度
【递推公式】f(n) = f(n-1)+f(n-2)
【初始状态】f(1)=1; f(2)=2;
剩下部分就是高精度加法,直接模板就可以了
参考代码:
#include
using namespace std;
const int N = 1e4+5;
int n, i;
string a[10000] = {"0","1","2"};//初始前两项的值
//高精度加法
string add(string a, string b) {
string c;
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
int t = 0;
for (int i = 0; i < a.size() || i < b.size(); i++) {
if (i < a.size()) t += a[i] - '0';
if (i < b.size()) t += b[i] - '0';
c.push_back(t % 10 + '0');
t /= 10;
}
if (t) c.push_back(t % 10 + '0');
reverse(c.begin(), c.end());
return c;
}
int main(){
cin >> n;
for(i = 3; i<= n; i++)
//递推
a[i] = add(a[i-1], a[i-2]);
cout<
为了庆祝元旦,J市决定举办全市小学足球联赛。各学校积极响应,共有N支球队报名参加,爱好足球的小W也参加了。为了活动的开展和不影响学生学习,只能安排K场比赛,每支球队最多参加两场比赛,至少参加零场比赛。因球队水平不同,每支球队都拥有一个和其他球队不同的水平等级(用一个正整数来表示)。在比赛中,等级高的球队必须作为客场,等级低的球队必须作为主场。每个球队最多只能做一次主场和一次客场。为了增加比赛的观赏度,观众希望K场比赛中球队水平差距的总和最小。比如有7支球队,他们的等级分别是30、17、26、41、19、38、18,要进行3场比赛。那么最好安排是球队2 vs 球队7, 球队7 vs 球队5 ,球队6 vs 球队4,此时等级差的总和等于(18-17) + (19-18) + (41-38) = 5达到最小。
第一行两个正整数N ,K。
接下来有N 行,第i行表示第i 支球队的等级。
对于20%的数据,1≤N≤300
对于80%的数据,1≤N≤5000
对于100%的数据,1≤N≤10000
保证所有输入数据中等级的值小于32000,1 ≤K≤ N-1
共一行,输出最小的等级差的总和。
7 3
30
17
26
41
19
38
18
5
解析
考点:贪心
思路:
对等级值从小到大排序,然后计算相邻的等级差值,这样计算的结果差值肯定都是最小的,再对等级差值从小到大排序。
参考代码:
#include
using namespace std;
int n,k,cnt=0;
int a[10010],b[10010];
long long ans=0;
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
//从小到大排序
sort(a+1,a+1+n);
//计算相邻的两个数的差值
for(int i=2;i<=n;i++){
b[++cnt]=a[i]-a[i-1];
}
//对b数组从小到大排序
sort(b+1,b+1+cnt);
//取出前k个最小的
for(int i=1;i<=k;i++){
ans+=b[i];
}
cout<
小W来到一个迷宫游玩,他发现迷宫非常特别。这个迷宫共有N层楼,配备了一个特别的电梯。迷宫的每一层都可以停电梯,而且第i层 (1<=i<=N)上有一个数字Ki(0<=Ki<=N),电梯内只提供四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:4 2 1 2 5代表了Ki(K1=4,K2=2,……),从一楼开始。在一楼,按“上”可以到5楼,按“下”是不起作用的,因为没有-3楼。进入迷宫中的人都想尽可能地少按电梯到达目的地,假如给你出发楼层A和目的楼层B,请你帮忙求出从A层到B层至少要按几次按钮。
输入文件共有二行,第一行为三个用空格隔开的正整数,表示N,A,B(1≤N≤200, 1≤A,B≤N),第二行为N个用空格隔开的正整数,表示Ki。
输出文件仅一行,即最少按键次数,若无法到达,则输出-1。
5 1 5
4 2 1 2 5
1
解析
考点:广搜BFS
广搜的模板题
参考代码
#include
using namespace std;
int n, a, b;
int x[205], step[205]; //step[i]到达楼层i需要的时间
queue q;
void bfs(){
q.push(a);
step[a]=0;
while(!q.empty()){
int t = q.front();
q.pop();
if(t == b) {cout<=1&&!step[t-x[t]]){ //Down,不越界 & 没到过
q.push(t - x[t]);
step[t-x[t]]=step[t]+1; //按一次
}
if(t+x[t]<=n&&!step[t+x[t]]){ //Up,不越界 & 没到过
q.push(t+x[t]);
step[t+x[t]]=step[t]+1; //按一次
}
}
cout<<-1; //到不了
}
int main(){
cin>>n>>a>>b;
for(int i=1;i<=n;i++)
cin >> x[i];
bfs();
}