fix(P14507): 修复算法逻辑错误并优化代码结构

修复货币兑换算法中的逻辑错误,确保正确处理边界情况
优化代码结构,移除冗余代码并改进变量命名
添加调试输出宏便于问题排查
禁用不必要的IO同步以提高性能
This commit is contained in:
Zengtudor 2025-11-17 11:58:13 +08:00
parent 80860dc70b
commit 07d7cadbc7
2 changed files with 67 additions and 38 deletions

1
.gitignore vendored
View File

@ -3,3 +3,4 @@
test.* test.*
*.in *.in
*.ans *.ans
*.out

View File

@ -3,19 +3,19 @@
#include <cstdio> #include <cstdio>
#include <iostream> #include <iostream>
#include <istream> #include <istream>
#include <iterator>
#include <map> #include <map>
#include <set> #define printf
#include <vector>
using ll = int64_t; using ll = int64_t;
#define sl static inline #define sl static inline
ll n,q; ll n,q;
std::map<ll, ll> m; std::map<ll, ll> m;
#define P(v)do{printf("[DEBUG] %s=%lld\n",#v,(v));}while(false)
sl void solve(){ sl void solve(){
std::cin>>n>>q; std::cin>>n>>q;
bool isnotok=false;
m.clear(); m.clear();
bool isnotok=false;
ll last=-1; ll last=-1;
for(ll i=1;i<=n;i++){ for(ll i=1;i<=n;i++){
ll a,b; ll a,b;
@ -25,57 +25,85 @@ sl void solve(){
isnotok=true; isnotok=true;
continue; continue;
} }
last=a;
m[a]+=b; m[a]+=b;
last=a;
} }
while(q--){ while(q--){
ll nq; ll nq,ans=0;
std::cin>>nq; std::cin>>nq;
printf("getq = %lld\n",nq); auto nm = m;
auto nm=m; if(nm.empty()){
ll ans=0; std::cout<<"-1\n";
while(nm.size()){
auto pm = nm.lower_bound(nq);
if(nq==0||pm->first>nq)break;
ans++;
ll min=1e9+7;
if(pm!=nm.end())pm++;
for(auto wp=nm.begin();wp!=pm;wp++){
min=std::min(min,wp->second);
}
printf("got min=%lld, pm->first=%lld\n",min,pm->first);
ll maxget = nq/pm->first;
printf("maxget=%lld\n",maxget);
ll get=std::min(maxget,min);
printf("get=%lld\n",get);
bool isrm=false;
std::vector<decltype(nm.begin())> rm;
for(auto wp=nm.begin();wp!=pm;wp++){
if(isrm){
rm.push_back(wp);
continue; continue;
} }
wp->second-=get; while(nm.size()&&nq){
if(wp->second==0){ P(nq);
isrm=true; auto pm = nm.lower_bound(nq);
rm.push_back(wp); if(pm==nm.begin()){
ans=-1;
break;
}
if(pm!=nm.end()&&pm->first>nq){
if(pm!=nm.begin()){
pm--;
}else{
ans=-1;
break;
} }
} }
for(auto i:rm){ ll getnum = nq/(std::prev(pm)->first+1);
nm.erase(i); P(std::prev(pm)->first+1);
if(getnum==0){
ans=-1;
break;
} }
for(auto i=nm.begin();i!=pm;i++){
getnum=std::min(getnum,i->second);
}
P(getnum);
nq-=getnum*(std::prev(pm)->first+1);
bool iserase=false;
ll erasekey=0;
for(auto i=nm.begin();i!=pm;){
if(iserase){
i=nm.erase(i);
continue;
}
i->second-=getnum;
if(i->second==0){
erasekey=i->first;
iserase=true;
i=nm.erase(i);
}else{
i++;
}
}
if (erasekey) {
auto p=nm.lower_bound(erasekey);
for(;p!=nm.end();){
p=nm.erase(p);
}
}
ans+=getnum;
}
P(nq);
P(nm.size());
if(nq!=0){
std::cout<<"-1\n";
continue;
} }
std::cout<<(ans==0?-1:ans)<<"\n"; std::cout<<(ans==0?-1:ans)<<"\n";
} }
} }
int main(){ int main(){
std::iostream::sync_with_stdio(false); // std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr); // std::cin.tie(nullptr);
ll T;
std::cin>>T; ll t;
while(T--){ std::cin>>t;
while(t--){
solve(); solve();
} }
} }