2021 年第二场蓝桥杯热身赛预计在 28 号举行,详见首页公告。

I题和题解思路一致只能过一个测试点

GOAT_0x2 发表于 1个月前 · 关联问题 修复建筑

#include <iostream> using namespace std; void sort(int a[], int b[], int n); int a[10000000]; int b[10000000]; int main() { //赋值a、b并得到得到开始的损耗量 int n; cin >> n; double d0 = 0; for (int i = 0; i < n; i++) { cin >> a[i]; d0 += a[i]; } for (int i = 0; i < n; i++) { cin >> b[i]; } //根据要先拆除的优先度排序 sort(a, b, n); //计算 double res = d0; for (int i = 0; i < n; i++) { for (int j = 0; j < b[i]; j++) { d0 = d0 - a[i] * 1.0 / b[i] * 1.0; res += d0; } } cout << res << endl; } void sort(int a[], int b[], int n) { //bubble int temp1, temp2; for (int i = 1; i < n; i++) { for (int j = 0; j < n - i; j++) { if (a[j] / b[j] < a[j + 1] / b[j + 1]) { temp1 = a[j]; a[j] = a[j + 1]; a[j + 1] = temp1; temp2 = b[j]; b[j] = b[j + 1]; b[j + 1] = temp2; } } } }

裂开了,和题解思路是一样的,不过在计算总损耗量时方法,我多了一层循环来遍历b[i],能通过一个测试点,题目的那个样例也能过,但是第二个测试点就偏差许多,调试了也没发现问题在哪,请问到底错在哪呢?

黄一肯 发表于 1个月前

没去详细看,但是粗略的看发现了你这个语句

if (a[j] / b[j] < a[j + 1] / b[j + 1])

会造成精度损失,也就是说他们都转为int型,如3/4 == 4/5,但实际应该是3/4 < 4/5

ilyh 发表于 1个月前

a,b数组开int的话,比较不如换个写法,如: a[j] \times b[j + 1]< a[j + 1] \times b[j] 而且排序的话,不如直接调用标准函数库algorithm中的sort函数更好