埋坑题记录
P5707 【深基2.例12】上学迟到
题目链接:https://www.luogu.com.cn/problem/P5707
题解代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int s, v;
cin >> s >> v; // 输入距离和速度
// 计算到达学校所需的总时间(分钟),并向上取整
int cnt = (s + v - 1) / v; // 使用整数运算向上取整
cnt += 10; // 加上垃圾分类所需的 10 分钟
// 学校要求到达时间为上午 8:00,转换为分钟
int latestArrivalTime = 8 * 60; // 8:00 AM 转换为分钟
int latestDepartureTime = latestArrivalTime - cnt; // 计算最晚出发时间
// 特判:当最晚出发时间为负数时,表示需要在前一天出发
if (latestDepartureTime < 0) {
latestDepartureTime += 24 * 60; // 向前一天回绕
}
// 计算最晚出发时间的小时和分钟
int hours = latestDepartureTime / 60; // 小时
int minutes = latestDepartureTime % 60; // 分钟
// 格式化输出小时和分钟,确保为两位数
printf("%02d:%02d\n", hours, minutes);
return 0; // 程序结束
}
埋坑点
一:进位
100/99程序结果会为1,所以需要特判,如果还有余数的话,那就+1;
二:负时间
第一个代码:
if (latestDepartureTime < 0) {
hours += 24; // 向前一天回绕
}
如果 latestDepartureTime 为负,直接将小时部分 hours 加 24。
这种处理方式不够准确,因为负分钟数没有正确处理,会导致错误的时间计算。
第二个代码:
if (latestDepartureTime < 0) {
latestDepartureTime += 24 * 60; // 向前一天回绕
}
第二个代码通过将负时间直接加上前一天的总分钟数(1440 分钟),让时间回绕到前一天的正确范围。
这样既能保证负时间的完整转换,也避免了分钟部分计算出错。
我的初始代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int s, v, t, h, m;
cin >> s >> v;
t = s / v + 10 + s % v ? 1 : 0;
t = 480 - t;
m = t % 60;
h = t / 60;
printf("%02d:%02d", h, m);
return 0;
}
几乎所有坑都踩了
AcWing 656. 钞票和硬币
题目链接:https://www.acwing.com/problem/content/658/
题解代码:
#include <iostream>
#include <vector>
#include <cstdio> // 用于 printf
using namespace std;
int main() {
double N;
scanf("%lf", &N); // 使用 scanf 读取浮点数
// 转换为以分为单位的整数
int amount = static_cast<int>(N * 100 + 0.5); // 四舍五入避免浮点数精度误差
// 钞票和硬币面额(以分为单位)
vector<int> notes = {10000, 5000, 2000, 1000, 500, 200};
vector<int> coins = {100, 50, 25, 10, 5, 1};
// 处理钞票
printf("NOTAS:\n");
for (int note : notes) {
int count = amount / note; // 计算当前面额所需数量
printf("%d nota(s) de R$ %.2f\n", count, note / 100.0);
amount %= note; // 剩余金额
}
// 处理硬币
printf("MOEDAS:\n");
for (int coin : coins) {
int count = amount / coin; // 计算当前面额所需数量
printf("%d moeda(s) de R$ %.2f\n", count, coin / 100.0);
amount %= coin; // 剩余金额
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main()
{
double N;
cin>>N;
int a[]={100,50,20,10,5,2};
cout<<"NOTAS:"<<endl;
for (int i = 0; i < 6; i++) {
int num = N / a[i];
printf("%d nota(s) de R$ %.2lf\n", num, (double)a[i]);
N = N - num * a[i];
}
double b[] = {1, 0.5, 0.25, 0.10, 0.05, 0.01};
cout<<"MOEDAS:"<<endl;
for (int j = 0; j < 6; j++) {
int num2=N/b[j]+10e-3;//通过 微小调整 来处理浮点数运算中的误差。
if (num2 < 0) num2 = 0;
printf("%d moeda(s) de R$ %.2lf\n", num2, b[j]);
N = N - num2 * b[j];
}
return 0;
}
double的精度问题