题目:スピカの天秤
小红有一个天平,天平的左侧有 𝑛 n 个砝码,砝码的重量用数组 𝑎 a 表示;右侧有 𝑚 m 个砝码,砝码的重量用数组 𝑏 b 表示。我们认为天平有三种状态: ∙ ∙左侧的重量大于右侧。 ∙ ∙左侧的重量等于右侧。 ∙ ∙左侧的重量小于右侧。 现在小红想知道,想要改变天平的状态,她最少需要拿走多少个砝码?
思路
为了用最少的砝码数达到目标,我们应该优先拿走最重的砝码。 对于 suma > sumb 的情况,我们可以尝试从左侧拿走最重的砝码,或者从右侧拿走最重的砝码,选择能更快达到目标的路径。 对于 suma < sumb 的情况,同理
代码
#include <bits/stdc++.h> using namespace std; bool cmp(int x,int y){ return x>y; } int main(){ int t; cin>>t; while(t--){ int n,m; long long suma=0,sumb=0; cin>>n>>m; vector a(n); vector b(m); for(int i=0;i<n;i++){ cin>>a[i]; suma+=a[i]; } for(int i=0;i<m;i++){ cin>>b[i]; sumb+=b[i]; } sort(a.begin(),a.end(),cmp); sort(b.begin(),b.end(),cmp); if(suma==sumb){cout<<1<<endl;} else if(suma<sumb){ int ans=0,i=0; while(suma<sumb){ sumb-=b[i++]; ans++; } cout<<ans<<endl; } else{ int ans=0,i=0; while(suma>sumb){ suma-=a[i++]; ans++; } cout<<ans<<endl; } } }

京公网安备 11010502036488号