60分WA求助
查看原帖
60分WA求助
227728
冰糖鸽子TJ鸽子协会楼主2020/9/29 17:22

RT,对了前六个点,后四个WA

看着第一个题解的思路写的(虽然看不懂第一个的代码)

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,a[2000000],out[2000000],f,cnt=0,c=0,ans = 1e18+7;
map<int,int>m;
void cuter(int start,int last)
{
	int smth = 1;
	start = last-start;
	for(int i=start;i < last;i++)
	{
		while(m[out[i]]>0)
		{
			m[out[i]]--;
			for(int j = i+1;m[out[j]]<=m[out[j-1]]+1 && j <= last;j++)
			{
				m[out[j]]--;
				smth=(j-i+1);
			}
			if(smth-1+i < last)
			{
				m[out[smth+i]]--;
				smth++;
			}
			ans = min(smth,ans);
		}
		
	}
}
signed main() 
{
	cin >> n;
	for(int i = 0;i < n;i++)
	{
		cin >> a[i];
		m[a[i]]++;
	}
	sort(a,a+n);
	out[cnt]=a[0];
	for(int i = 1;i < n;i++)
	{
		if(out[cnt]!=a[i])
		{
			cnt++;
			out[cnt]=a[i];
		}
	}
	for(int i = 1;i <= cnt;i++)
	{
		if(out[i]-1==out[i-1] || c==0)
		{
			c++;
		}
		else
		{
			cuter(c,i-1);
			c=1;
		}
	}
	if(c!=0)
	{
		cuter(c,cnt);
	}
	if(ans == 1e18+7)
	{
		cout << 1;
		return 0;
	}
	cout << ans;
    return 0;
}
2020/9/29 17:22
加载中...