

Câu 6: Mua hàng
|
MUAHANG.inp |
MUAHANG.out |
|
36 5 5 |
150 |
ngôn ngữ c++ ạ
Hãy luôn nhớ cảm ơn và vote 5*
nếu câu trả lời hữu ích nhé!
`* C++:`
`" "`
#include <iostream>
using namespace std;
int main()
{
//freopen("MUAHANG.inp", "r", stdin);
//freopen("MUAHANG.out", "w", stdout);
long long n, p, k;
cin >> n >> k >> p;
cout << (n % (k + 1)) * p + (n / (k + 1)) * k * p;
return 0;
}
_______________________________________________
`" "`
- Cần mua `n` cây bút
- Giá mua lẻ mỗi chiếc bút chì là `p`
- Mỗi `k` chiếc khi mua sẽ được tặng một chiếc
`" "`
- Chia số lần mua `n` cây bút chì ra nhiều lần mua, cụ thể mỗi lần mua tối đa `k` chiếc bút chì, thì:
+ Mỗi lần mua sẽ nhận được tối đa `k + 1` chiếc bút chì
+ Số tiền cần trả tối đa mỗi lần mua là `(k + 1) * p`
`" "`
- Nếu `n` chia hết cho `k + 1` thì số lần mua là `n / (k + 1)`, với mỗi lần mua là `k` chiếc thì số tiền cần trả là `n / (k + 1) * k * p`
- Ngược lại thì cần tính tiền cho những chiếc còn lại của lần mua cuối cùng, số bút cần mua là n % (k + 1), số tiền trả cho lần mua cuối là (n % (k + 1)) * p
- Vậy tổng số tiền cần trả là n / (k + 1) * k * p + (n % (k + 1)) * p
Hãy giúp mọi người biết câu trả lời này thế nào?
Ý tưởng: Ta thấy cứ mua mỗi k bút sẽ được tặng 1 bút nên ta coi giá tiền của k+1 cây bút là p*k. Sau đó ta sẽ lấy các nhóm k+1 tối đa bằng cách lấy n/(k+1) vì mua k+1 sẽ luôn có số tiền tối ưu nhất. Sau đó nếu như chia tối đa các nhóm k+1 cây bút mà còn dư (n%(k+1)!=0) thì ta chỉ cần mua lẻ các cây bút còn lại (n%(k+1)*p) hoặc ta có thể rút gọn câu lệnh if (n%(k+1)!=0 ) luôn vì nếu n%(k+1)=0 thì số tiền mua thêm là 0*p vẫn bằng 0.
Code mẫu:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,k,p,tien=0;
int main()
{
cin>>n>>k>>p;
ll km=p*k;
tien+=(n/(k+1))*km;
if (n%(k+1)!=0)// có thể bỏ
tien+=(n%(k+1))*p;
cout<<tien;
}
_______________________________________________
Hãy hiểu và làm lại chứ đừng chỉ lấy code
Hãy giúp mọi người biết câu trả lời này thế nào?
Bảng tin