前言
这一题折磨我好久(QAQ),给的样例测试是正确的,提交上去就是错误的答案。
首先:这一题找零需要考虑的有没有分这个数,有进行对分位置上的值进行考虑,而其中分上面有的有值,有的没有数
例如:
9.90
9.91
这都是带有分的测试样例,但上面一个分上面有相应的数值,而下面一个却没有数值,这个是需要分开进行考虑的
其次:
就是输出格式的问题,空格以及最后取小数点后两位这个也需要进行注意的
7-10 G. 找零 (100 分)
超市收银台出了故障,需要帮忙完成收银和找零的工作,如果顾客买的东西的总价值含有”分”,就进位计算.如:购买了总价值9.91元的物品,收到20元,应找零10元整.如钱不够,输出-1
输入格式:
第一行输入正整数T,表示数据的组数。
每组数据的第一行是购买的物品的种类数n 和顾客给的钱的总数m(顾客给的钱不会有”分”),接下来有n行[1,100],每行两个数字,
第一个数字是该物品的价格Pi([0.01,10000]),第二个数字是该物品的数量Ci([1,10])。
输出格式:
对于每组数据,输出一行,格式为’case t: x’,t 为数据的组号,x 为题目要求的结果。
输入样例:
3
5 200.00
9.99 1
8.88 1
0.50 1
1.00 1
2.33 3
1 10.00
9.99 1
2 100.00
98.99 1
1.02 1
输出样例:
case 1: 172.60
case 2: 0.00
case 3: -1
给出三个代码仅供参考
一:自己写的经过各方的努力进行修改得到的
#include<bits/stdc++.h>
using namespace std;
int main() {
int t,b;
double m,a;
cin>>t;
for(int j=1; j<=t; j++) {
int n;
int x,y,s;
double sum=0.0,c=0.0,h=0.0;
cin>>n>>m;
for(int i=0; i<n; i++) {
cin>>a>>b;
sum+=a*100*b;
}
s=sum;
x=s%10;//取余
y=s/10;//取商
if(x!=0) {
c=(y*10+10)*0.01;
//cout<<c<<endl;
}
else
c=sum/100;//就是给出的样例中是9.90的
h=m-c;
// cout<<m<<"-"<<c<<endl;
if(c>m)
// cout<< "case " << j << ": -1" << endl;
printf("case %d: -1\n",j);
else
printf("case %d: %0.2f\n",j,h);
}
return 0;
}
二:学长写的,使用数组以及调用函数的
#include <iostream>
using namespace std;
double jindu(double num) {
int a = num*100;
if((a%10)!=0)
a = a/10*10+10;
return (double)a/100;
}
int main() {
int t=-1;
cin>>t;
double r[100];
for(int k = 0; k < t; k++) {
int n = -1;
double sum = 0, m = -1;
cin >> n >> m;
for(int count = 0; count < n; count++) {
double pi = -1;
int ci = -1;
cin>>pi>> ci;
pi *= ci;
sum +=pi;
}
sum=jindu(sum);
if(sum > m)
r[k]=-1;
else
r[k]=m-sum;
}
for(int j=0; j<t; j++) {
if(r[j]==-1)
printf("case %d: -1\n",j+1);
else
printf("case %d: %.2lf\n",j+1,r[j]);
}
return 0;
}
三:网上一个大神给出的代码
#include<bits/stdc++.h>
using namespace std;
int main() {
cout.setf(ios::fixed);
int t,b;
double m,a;
double money=0;
scanf("%d",&t);
for(int j=1; j<=t; j++) {
int n;
double sum=0.0;
cin>>n>>m;
for(int i=0; i<n; i++) {
cin>>a>>b;
sum+=a*10*b;
}
sum = ceil(sum);
sum /=10;
money=m-sum;
if(sum>m)
cout<< "case " << j << ": -1" << endl;
else
cout << "case " << j <<setprecision(2) << ": " << money << endl;
}
return 0;
}
总结
卡精度卡到疯,代码是越写越垃圾