mirror of
https://gitcode.com/Zengtudor/alg2025.git
synced 2025-12-16 12:13:03 +00:00
fix(P14507): 修复算法逻辑错误并优化代码结构
修复货币兑换算法中的逻辑错误,确保正确处理边界情况 优化代码结构,移除冗余代码并改进变量命名 添加调试输出宏便于问题排查 禁用不必要的IO同步以提高性能
This commit is contained in:
parent
80860dc70b
commit
07d7cadbc7
3
.gitignore
vendored
3
.gitignore
vendored
@ -2,4 +2,5 @@
|
||||
/.cache
|
||||
test.*
|
||||
*.in
|
||||
*.ans
|
||||
*.ans
|
||||
*.out
|
||||
@ -3,19 +3,19 @@
|
||||
#include <cstdio>
|
||||
#include <iostream>
|
||||
#include <istream>
|
||||
#include <iterator>
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <vector>
|
||||
#define printf
|
||||
using ll = int64_t;
|
||||
#define sl static inline
|
||||
|
||||
ll n,q;
|
||||
std::map<ll, ll> m;
|
||||
#define P(v)do{printf("[DEBUG] %s=%lld\n",#v,(v));}while(false)
|
||||
|
||||
sl void solve(){
|
||||
std::cin>>n>>q;
|
||||
bool isnotok=false;
|
||||
m.clear();
|
||||
bool isnotok=false;
|
||||
ll last=-1;
|
||||
for(ll i=1;i<=n;i++){
|
||||
ll a,b;
|
||||
@ -25,57 +25,85 @@ sl void solve(){
|
||||
isnotok=true;
|
||||
continue;
|
||||
}
|
||||
last=a;
|
||||
m[a]+=b;
|
||||
last=a;
|
||||
}
|
||||
while(q--){
|
||||
ll nq;
|
||||
ll nq,ans=0;
|
||||
std::cin>>nq;
|
||||
printf("getq = %lld\n",nq);
|
||||
auto nm=m;
|
||||
ll ans=0;
|
||||
while(nm.size()){
|
||||
auto nm = m;
|
||||
if(nm.empty()){
|
||||
std::cout<<"-1\n";
|
||||
continue;
|
||||
}
|
||||
while(nm.size()&&nq){
|
||||
P(nq);
|
||||
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);
|
||||
if(pm==nm.begin()){
|
||||
ans=-1;
|
||||
break;
|
||||
}
|
||||
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);
|
||||
if(pm!=nm.end()&&pm->first>nq){
|
||||
if(pm!=nm.begin()){
|
||||
pm--;
|
||||
}else{
|
||||
ans=-1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
ll getnum = nq/(std::prev(pm)->first+1);
|
||||
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;
|
||||
}
|
||||
wp->second-=get;
|
||||
if(wp->second==0){
|
||||
isrm=true;
|
||||
rm.push_back(wp);
|
||||
i->second-=getnum;
|
||||
if(i->second==0){
|
||||
erasekey=i->first;
|
||||
iserase=true;
|
||||
i=nm.erase(i);
|
||||
}else{
|
||||
i++;
|
||||
}
|
||||
}
|
||||
for(auto i:rm){
|
||||
nm.erase(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";
|
||||
}
|
||||
}
|
||||
|
||||
int main(){
|
||||
std::iostream::sync_with_stdio(false);
|
||||
std::cin.tie(nullptr);
|
||||
// std::iostream::sync_with_stdio(false);
|
||||
// std::cin.tie(nullptr);
|
||||
|
||||
ll T;
|
||||
std::cin>>T;
|
||||
while(T--){
|
||||
|
||||
ll t;
|
||||
std::cin>>t;
|
||||
while(t--){
|
||||
solve();
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user