乐于分享
好东西不私藏

CSP-X 2015山东省小学组复赛试题解析(上半场)

CSP-X 2015山东省小学组复赛试题解析(上半场)

T1 出租车费

题目大意:

给定一个路程 x 和时间标识 is_day

  • 1 表示白天;
  • 0 表示夜间。

根据出租车收费规则计算最终费用,并保留两位小数输出。

解题思路:

根据路程范围进行分段计算:

  • 当 x<=3 时,起步价为 9 元;
  • 当 3<x<=6 时,超过 3 公里的部分按照对应时间的单价计算;
  • 当 x>6 时,前 3 公里按照起步价计算,3~6 公里按照第二档价格计算,超过 6 公里的部分按照第三档价格计算。

使用 fee 保存最终费用,最后格式化输出即可。

参考代码:

#include <bits/stdc++.h>using namespace std;int main(){int x, is_day;    cin >> x >> is_day;double fee = 0.0;if (x <= 3) {        fee = 9.0;    } else if (x <= 6) {double rate;if (is_day) rate = 1.5;else rate = 1.75;        fee = 9.0 + (x - 3) * rate;    } else {double rate2, rate3;if (is_day) {            rate2 = 1.5;            rate3 = 2.25;        } else {            rate2 = 1.75;            rate3 = 2.5;        }        fee = 9.0 + 3.0 * rate2 + (x - 6) * rate3;    }    cout << fixed << setprecision(2) << fee << '\n';return 0;}

T2 门牌号

题目大意:

给定一个数字 n

要求找到两个数字 x 和 k,满足: $1+2+\cdots+(x-1)+(x+1)+\cdots+k - x = n $ 也就是:

前 k 个数字的和去掉 x,然后再减去 x,结果等于 n

输出满足条件的 x 和 k

解题思路:

设:

根据题目条件可得:

移项得到:

因此:

  • (sum-n) 必须是偶数;
  • x=(sum-n)/2
  • 同时需要满足 1<=x<=k

枚举 k,计算对应的 x,找到满足条件的答案即可。

时间复杂度:

O(40000)

参考代码:

#include <bits/stdc++.h>using namespace std;int main(){freopen("number.in""r", stdin);freopen("number.out""w", stdout);int n;    cin >> n;for (int k = 1; k <= 40000; k++) {long long sum = (long long) k * (k + 1) / 2;int x = (sum - n) / 2;if ((sum - n) % 2 == 0 && x >= 1 && x <= k) {            cout << x << " " << k << '\n';return 0;        }    }return 0;}