40pts求hack/求调
查看原帖
40pts求hack/求调
577628
zgy_123楼主2024/11/24 23:15

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);
//			printf("%d %d\n",mn,mx);
			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<4,如何证明这种方法的正确性?

2024/11/24 23:15
加载中...