JT3,ST1

JT3
提供一个新奇的思路(因为考场上脑抽所以是这么想的,不少写了一个东西qwq)
其实我们可以考虑dp(类似题目,请自行脑补),但是这里特殊的是 0 ,所以我想的是每次试试加 0 (最多加两个,是规律里的情况,但是考场上只加了一个qwq)。
这样会超时但是,我们还发现其实有用的dp到几十就行,剩下的全是8,那么我们就很好写了。

string f(string x,string y)
{
	if(x.size()==y.size())
	{
		if(x<=y) return x;
		else return y;
	}
	if(x.size()<y.size()) return x;
	return y;
}
cin>>t;
for(int i=0;i<=1000;++i) dp[i]="z";
dp[0]="";
vis[0]=1;
for(int i=1;i<=9;++i)
for(int j=w[i];j<=1000;++j)
{
	if(vis[j-w[i]])
	{
		vis[j]=1;
		if(dp[j]=="z") dp[j]=dp[j-w[i]]+to_string(i);
		else dp[j]=f(dp[j],dp[j-w[i]]+to_string(i));
	}
	if(j>=w[i]+w[0]&&vis[j-w[i]-w[0]])
	{
		vis[j]=1;
		if(dp[j]=="z") dp[j]=dp[j-w[i]-w[0]]+to_string(i)+to_string(0);
		else dp[j]=f(dp[j],dp[j-w[i]-w[0]]+to_string(i)+to_string(0));
	}
	if(j>=w[i]+w[0]+w[0]&&vis[j-w[i]-w[0]-w[0]])
	{
		vis[j]=1;
		if(dp[j]=="z") dp[j]=dp[j-w[i]-w[0]-w[0]]+to_string(i)+to_string(0)+to_string(0);
		else dp[j]=f(dp[j],dp[j-w[i]-w[0]-w[0]]+to_string(i)+to_string(0)+to_string(0));
	}
}
while(t--)
{
	k=1000000;
	cin>>n;
	if(n==1)
	{
		cout<<-1<<"\n";
		continue;
	}
	if(n%7==0)
	{
		for(int i=1;i<=n/7;++i) cout<<8;
		cout<<"\n";
		continue;
	}
	if(n<=100)
	{
		cout<<dp[n]<<"\n";
		continue;
	}
	for(int i=1;i<=100;++i)
	if(vis[i]&&(n-i)%7==0)
	{
		int Siz=dp[i].size(),siz=(n-i)/7;
		if(Siz+siz<m.size()+k)
		{
			m=dp[i];
			k=siz;
		}
		else
		{
			if(dp[i]<m)
			{
				m=dp[i];
				k=siz;
			}
		}
	}
	cout<<m;
	for(int i=1;i<=k;++i) cout<<8;
	cout<<"\n";
}

w数组是拼这个数字要多少根
ST1
我们发现最好情况下一定是让攻击力小的尽可能打小的,那么我就弄一个指针 l ,然后排序,如果这攻击力大于 l 的攻击力,那么满足调减指针后移。

cin>>n;
for(int i=1;i<=n;++i) cin>>a[i];
sort(a+1,a+1+n);
for(int i=1;i<=n;++i)
if(a[i]>a[l])
{
	ans++;
	l++;
}
cout<<n-ans;

点赞破5个讲T2的特殊性质AB(没A,qwq)

5 个赞

我用的也是 dp ,然后 MLE 了。
于是就有了我的头像和用户名。


不可能吧你的应该是10MB才对不会超吧

啊?
10^5\times 10^5=10^{10}
10^{10}B=10^2MB
应该是 100MB 啊。

不会吧。
我听别人说会 MLE

那也没超呀

《很好写》