社区讨论

vi<=3的情况为什么WA?QAQ

P11323【MX-S7-T1】「SMOI-R2」Happy Card参与者 3已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
9 条
当前快照
1 份
快照标识符
@m3v9boz7
此快照首次捕获于
2024/11/24 15:07
去年
此快照最后确认于
2025/11/04 14:01
4 个月前
查看原帖
如果您不想看这冗长的思路可以看看这组数据自己给出的期望输出是否有误?
MARKDOWN
7
1
1000000000
9
0 0 0 0 0 0 0 0 0
6
2 1 1 2 1 2
7
3 3 3 3 1 1 2  
8
3 3 1 2 2 2 2 2
2
3 3
6
1 1 1 3 3 2

期望输出:
250000000
0
6
5
7
2
4

我的思路是:
c[1],c[2],c[3]表示 v[i]=1/2/3 的牌种类数
if(c[3] <= c[1]+c[2])
那么先每个1带走一个3,剩下的3每个2带走3(我觉得2,3出光要2次比出完2再处理3的要3次要优,但可能是假贪心?麻烦指正或给反例)
CPP
c[1]>=c[3]时,答案就是c[1]+c[2]
c[1]<c[3]时,ans=c[1]+(c[3]-c[1])*2+c[2]-(c[3]-c[1])=c[2]+c[3]
ans=max(c[1],c[3])+c[2]
if(c[3]>c[1]+c[2])
先按上面情况处理,剩下的3两两配对3带1,剩下一堆2以及可能没得配对的一个3,分一个2和3进行3带1得到1,0 → 0,0,其余的2对子出掉
CPP
余下x个3配对  x=c[3]-c[1]-c[2]
x为偶数,ans=c[1]+2c[2]+x(因为每两个配对,每对31+对子两次操作,x/2*2=x)
x为奇数 ans=c[1]+2c[2]+x(配对后 (x-1)/22,分了一个2进行2个操作:(x-1)/2+(x-1)/2-1+2=x)
CPP

#include<bits/stdc++.h>
#define m0(a) memset(a,0,sizeof(a))
#define endl '\n'
#define f(i,l,r) for(int i=l;i<=r;i++)
using namespace std;
const int N=3*1e5+5;
int n,T,maxn;
int num[N],c[4];
/*
num[i] 
2|num[i]: 
*/
void Init()
{ 
	c[1]=c[2]=c[3]=0;
	maxn=-0x3f3f3f3f;
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>T;
	while(T--){
		cin>>n;
		Init();
		f(i,1,n) 
		{
			cin>>num[i];
			if(num[i]<=3) c[num[i]]++;
			maxn=max(maxn,num[i]);
		}
		if(!maxn) cout<<0<<endl;
		else if(n==1)//1
		{
			int qwq=num[1];
			if(qwq%4==3) cout<<(qwq/4)+2<<endl;
			else if(qwq%4==0) cout<<qwq/4<<endl;
			else cout<<(qwq/4)+1<<endl;
			continue;
		}
		else if(maxn<=2) cout<<c[1]+c[2]<<endl;//7
		else if(maxn<=3) //请看这里
		{																		
			if(c[3] <= c[1]+c[2]) cout<<max(c[1],c[3])+c[2]<<endl;
			else//c[1]+2c[2]+c[3]-(c[1]+c[2])				
			{			
				cout<<c[3]+c[2]<<endl;
			}
		}
		else 
		{
			int ans=0;
			f(i,1,n)
			{
				if(num[i]==3) ans+=2;
				else if(num[i]<4) ans++;
				else ans+=num[i]/4+ num[i]%4==3 ? 2 : 1; 
			}	
			cout<<ans<<endl;
		}
	}
	return 0;
}

回复

9 条回复,欢迎继续交流。

正在加载回复...