求大佬分析一个不知道是否正确的思路

P1570 KC 喝咖啡

你这个用的贪心的思想呀,但是,不能在这么贪,假如有一杯浓度100,体积100的水,一杯浓度50,体积1000的水,一杯浓度1,体积1的水,3杯里面选两杯混合后浓度最大,你的son就相当于浓度,按你的贪心就会选100和50的,但实际上,浓度50的会更大程度上稀释浓度100的水,浓度1的反而因为体积小而对浓度100的水影响更小
by hellomoon @ 2023-10-11 19:56:35


顺着这个思想,我们就应该知道应该以如何更少的稀释为目标贪心.一开始的浓度肯定设置为最大浓度,然后均以稀释更少为目标依次加入下一杯,直至总共用了m杯.
by hellomoon @ 2023-10-11 20:14:22


所以贪心是能做的,复杂度为n*nlogn, 不知道为什么题解没有贪心的做法
by hellomoon @ 2023-10-11 20:18:37


@[hellomoon](/user/966994) 我用贪心做只有60分 就是按单位时间的美味度最大的调料来排序 请问大佬这样做有什么问题
by ycy1124 @ 2024-01-26 11:29:18


@[ycy1124](/user/1199534) 这个和上面我说的是一样的,我说的浓度就是单位时间美味度,体积就是它要消耗的时间,你再看看试试
by hellomoon @ 2024-01-26 15:42:36


@[ycy1124](/user/1199534) 再解释一遍,假设已经选择的总的调料美味值是10000,时间为100,下面还有 美味值是50000,时间为1000的调料 以及 美味值是1,时间是1的调料,很显然,虽然时间为1000的调料单位美味值更高,为50,但它体积太大了,反将原来的稀释了,而单位美味值为1的,它的体积也是1,体积太小,反而几乎对原来的调料没有影响
by hellomoon @ 2024-01-26 15:51:31


@[ycy1124](/user/1199534) 所以,我们直接将单位美味值最高的调料作为第一个加入的调料,此后加入的调料都是以尽量少稀释它为目标,也是一个贪心,你想要这个解法代码的话,可以叫我私发代码给你
by hellomoon @ 2024-01-26 15:53:47


@[hellomoon](/user/966994) 谢谢大佬,我再去试试。
by ycy1124 @ 2024-01-26 16:13:29


@[hellomoon](/user/966994) 求大佬帮忙看看代码 ```cpp #include<bits/stdc++.h> using namespace std; int a[201],b[201]; double c[201]; int main() { long long js1=0,js2=0; int n,m; cin>>n>>m; for(int i=1;i<=n;i++) { cin>>a[i]; } for(int i=1;i<=n;i++) { cin>>b[i]; c[i]=1.000000*a[i]/b[i]; } for(int i=1;i<=n;i++) { for(int k=1;k<=n-i;k++) { if(c[k]<c[k+1]) { swap(c[k],c[k+1]); swap(a[k],a[k+1]); swap(b[k],b[k+1]); } } } bool pd=1; for(int i=1;i<=n;i++) { for(int k=2;k<=n-i;k++) { if(c[k]==c[k+1]) { if(pd==0&&b[k]+a[k]>a[k+1]+b[k+1]) { swap(c[k],c[k+1]); swap(a[k],a[k+1]); swap(b[k],b[k+1]); } else if(pd==1&&b[k]+a[k]<a[k+1]+b[k+1]) { swap(c[k],c[k+1]); swap(a[k],a[k+1]); swap(b[k],b[k+1]); } } else { pd=0; } } } for(int i=1;i<=m;i++) { js1+=a[i]; js2+=b[i]; } printf("%.3lf",1.0*js1/js2); return 0; } ``````
by ycy1124 @ 2024-01-26 16:33:23


@[ycy1124](/user/1199534) 你不会快排?一般这种贪心都是用快排做的
by hellomoon @ 2024-01-26 16:53:39


| 下一页