非常容易理解 的思路
2026-08-15 11:37:24
发布于:北京
满分 思路代码还没想出来,看了题解区,只有一个满分思路,个人觉得理解起来还是有一点难度,给一个虽然超时只能拿到80分,但超容易理解的思路代码。
n张课堂优秀券、m张作业优秀券,用来兑换奖品:
方法1:a 张课堂优秀券和 b 张作业优秀券兑换一份奖品
方法2:b 张课堂优秀券和 a 张作业优秀券兑换一份奖品
求最多能兑换多少份奖品?
以上的设定,某种程度上课堂优秀券和作业优秀券等价。
贪心思路:用优秀券兑换奖品时,要想兑换的奖品最多,每次兑换,倾向于消耗更多数量偏多的优秀券,那如何办到呢?自然是那种优秀券更多,就用更多的这种优秀券去兑换奖品。
#include<bits/stdc++.h>
using namespace std;
int n, m, a, b;
int ans; //可兑换的奖品数量
int main() {
cin>>n>>m>>a>>b;
if(a<b) swap(a, b); //a存大值,b存小值
while(true) {
//倾向于更多消耗数量多的优秀券,所以,如果n小于m,交换n,m,每次用a消耗n,用b消耗m
if(n<m) swap(n, m);
if(n>=a && m>=b) {
n-=a;
m-=b;
ans++;
} else break; //当n、m不够消耗,循环终止
}
cout<<ans;
return 0;
}
显然,上述代码思路的时间复杂度是:O(n),数据量最大为,会超时。不知道有没有大佬可以在这个思路的基础上做进一步的优化。我再想想,想出来再更新。
PS. 这个代码在acgo可以拿到满分。
——————————————————————————————————
上述思路每次循环只兑换一份奖品,如果一次循环可以兑换多次奖品的话,不就可以减少循环次数了吗!!!
假定最初n张课堂优秀券、m张作业优秀券满足n>=m(不满足交换即可)
由于每次都让较多的优秀券减少的更多,所以在进行k(k>0)次兑换后,一定可以使得n<m,找到这个兑换次数,每次循环进行k次兑换。
#include<bits/stdc++.h>
using namespace std;
int n, m, a, b;
int ans;
int main() {
cin>>n>>m>>a>>b;
if(a<b) swap(a, b); //a存大值,b存小值
while(true) {
//倾向于更多消耗数量多的优秀券,所以,如果n小于m,交换n,m,每次用a消耗n,用b消耗m
if(n<m) swap(n, m);
//由于每次都让较多的优秀券减少的更多,所以在进行k(k>0)次兑换后,一定可以使得n<m
//k1:用a消耗n的兑换次数
//k2:用b消耗m的兑换次数
//k3:从 "n大m小"到"n小m大" 的兑换次数
int k1=n/a, k2=m/b, k3=(n-m)/(a-b)+1;
//每次循环进行多次兑换,兑换到 n<m 或不可再进行兑换为止
int k=min(k1, min(k2, k3));
if(k==0) break; //无法兑换终止循环
ans+=k;
n-=k*a;
m-=k*b;
}
cout<<ans;
return 0;
}
提交两个测试样例从TLE变成了RE,代码运行过程中要除以(a-b),当a和b相等时,会出现除0错误,a和b相等的情况可以作为特例进行处理。
#include<bits/stdc++.h>
using namespace std;
int n, m, a, b;
int ans;
int main() {
cin>>n>>m>>a>>b;
if(a==b){ //特例提前处理
cout<<min(n/a, m/a);
return 0;
}
if(a<b) swap(a, b); //a存大值,b存小值
while(true) {
//倾向于更多消耗数量多的优秀券,所以,如果n小于m,交换n,m,每次用a消耗n,用b消耗m
if(n<m) swap(n, m);
//由于每次都让较多的优秀券减少的更多,所以在进行k(k>0)次兑换后,一定可以使得n<m
//k1:用a消耗n的兑换次数
//k2:用b消耗m的兑换次数
//k3:从 "n大m小"到"n小m大" 的兑换次数
int k1=n/a, k2=m/b, k3=(n-m)/(a-b)+1;
//每次循环进行多次兑换,兑换到 n<m 或不可再进行兑换为止
int k=min(k1, min(k2, k3));
if(k==0) break;
ans+=k;
n-=k*a;
m-=k*b;
}
cout<<ans;
return 0;
}
luogu拿了90,仍然有两个测试样例超时,分析了一下,如果每次算出来的k都是1,则算法效率弱化到和之前一样。
——————————————————————————————————
这里空空如也







有帮助,赞一个