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)