vs上样例全过,但提交完了只有样例出错???

P1909 [NOIP2016 普及组] 买铅笔

然后你的第一个for
by zhaohaoran0302 @ 2023-09-02 08:49:04


@[zhaohaoran0302](/user/798757) 还是不懂,第一个for哪里出问题了吗?
by compatibility @ 2023-09-02 13:01:07


你的代码是求每个套餐一支铅笔的价钱再乘上全部支数。 但题目说:“商店不允许将铅笔的包装拆开,因此 P 老师可能需要购买超过n支铅笔才够给小朋友们发礼物。” 所以这种做法是错的。 AC代码:```cpp #include<bits/stdc++.h> using namespace std; int main(){ int n; cin>>n; int minn=INT_MAX; for(int i=1;i<=3;i++){ double x1,x2;//x1是支数,x2是价钱 cin>>x1>>x2; int t=ceil(n/x1);//求要买几个套餐 minn=min(minn,(int)(t*x2));//更新最小值 } cout<<minn; return 0; } ``` 希望对你有帮助。
by ZWK210917 @ 2023-09-02 15:11:25


你的代码是求每个套餐一支铅笔的价钱再乘上全部支数。 但题目说:“商店不允许将铅笔的包装拆开,因此 P 老师可能需要购买超过n支铅笔才够给小朋友们发礼物。” 所以这种做法是错的。 AC代码:```cpp include<bits/stdc++.h> using namespace std; int main(){ int n; cin>>n; int minn=INT_MAX; for(int i=1;i<=3;i++){ double x1,x2;//x1是支数,x2是价钱 cin>>x1>>x2; int t=ceil(n/x1);//求要买几个套餐 minn=min(minn,(int)(t*x2));//更新最小值 } cout<<minn; return 0; } ``` 希望对你有帮助。
by ZWK210917 @ 2023-09-02 15:12:59


@[ZWK210917](/user/906826) 对啊,所以我后面加了一步,算出每个套餐一支铅笔的价钱再乘上全部支数之后把价格递增,直到能被一包铅笔的价格整除,这没啥问题吧,还是说哪里出错了?我在VS上前三个样例都能输出正确答案的..
by compatibility @ 2023-09-02 15:48:11


我一开始看错了。 程序本身没太大问题。只是”a = req * (x2 / x1);“这条语句有问题。因为有可能会出现无限小数。 比如:1500 100 100/1500=0.066666666666 当我天真地提交后:WA了一个点。 后来我发现精度不够。于是将float改成了 double 上代码: ```cpp #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<math.h> int main() { double req = 0; scanf("%lf", &req); double x1 = 0; double x2 = 0; int min =(1<<31)^(-1) ; for (int i = 0; i < 3; i++) { double n = 0; scanf("%lf", &x1); scanf("%lf", &x2); double a = 0; a = req * x2 / x1; int b = a; if (a > b) b += 1; for (b; b % (int)x2 != 0; b++) { } if (b< min) { min = b; } } printf("%d", min); return 0; } ``` 我的两个测试点啊!qwq
by ZWK210917 @ 2023-09-02 21:44:45


|