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;}
夜雨聆风