WA+TLE。可以理解TLE,但是为什么会有WA?
#include<bits/stdc++.h>
using namespace std;
set<int>q;
map<int,int>mp;
void del(int pos){
mp[pos]--;if(!mp[pos]) q.erase(pos);
}
void ins(int pos){
if(!pos) return;
if(!mp[pos]) q.insert(pos);mp[pos]++;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
mp.clear();
q.clear();
int n;
scanf("%d",&n);
for(int i=1,x;i<=n;i++)
scanf("%d",&x),ins(x);
long long ans=0;
while(!q.empty()){
auto it=q.begin();
int mn=*it;
if(q.size()==1&&mp[mn]==1){
ans+=mn/4+mn%4/2+mn%2;
break;
}
it=q.end(),it--;
int mx=*it;
del(mx),del(mn);
if(mx<3){
ans+=2;
continue;
}
int ct=min(mx/3,mn);
ans+=ct,mx-=ct*3,mn-=ct;
ins(mx),ins(mn);
}
printf("%lld\n",ans);
}
return 0;
}
思路:每次找牌数最多和最少的两堆,用三带一消耗,如果最多的堆少于三张就直接两次出完。
另,现有做法都是将每堆牌都出炸直到 <4,如何证明这种方法的正确性?