CodeForces - 1409
A - Yet Another Two Integers Problem
一直取10,剩余的一次完成
ll t,a,b;
int main()
{
scanf("%lld",&t);
while(t--)
{
scanf("%lld%lld",&a,&b);
printf("%lld\n",(max(a,b)-min(a,b))%10==0?(max(a,b)-min(a,b))/10:(max(a,b)-min(a,b))/10+1);
}
}
B - Minimum Product
将n次优先分配个第一个和优先分配给第二个,取min
ll t,a,b,x,y,n;
int main()
{
scanf("%lld",&t);
while(t--)
{
scanf("%lld%lld%lld%lld%lld",&a,&b,&x,&y,&n);
WW(min((a-(min(n,a-x)))*(b-(min(b-y,n-min(n,a-x)))),(b-(min(n,b-y)))*(a-(min(a-x,n-min(n,b-y))))));
}
}
C - Yet Another Array Restoration
枚举最小值i和间隙大小j,判断是否能够包含x,y两个数
int t,n,x,y,a,b;
int main()
{
scanf("%d",&t);
while(t--)
{
int maxx=INF;
scanf("%d%d%d",&n,&x,&y);
rep(i,1,50)
{
rep(j,1,50)
{
bool mark1=false,mark2=false;
rep(k,1,n)
{
int M=i+(k-1)*j;
if (M==x)mark1=true;
if (M==y)mark2=true;
}
if (mark1&&mark2&&i+(n-1)*j<maxx)
{
maxx=i+(n-1)*j;
a=i,b=j;
}
}
}
rep(i,1,n)printf("%d ",a+(i-1)*b);puts("");
}
return 0;
}
D - Decrease the Sum of Digits
从末尾开始,将位逐步扩张为0(即假设[j--,len-1]位都为0,),以此来减小sum
注意点1:前导0
注意点2:如果末尾已经全为0,则前一位不需要进1
int t,n;
char s[maxn];
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%s%d",s,&n);
int len=strlen(s),sum=0;
repp(i,0,len)sum+=s[i]-'0';
if (sum<=n)W(0);
else
{
for (int j=len-1;j>=0;j--)
{
bool mark=true;
rep(i,j,len-1)if (s[i]!='0')mark=false;
sum=mark?0:1;
rep(i,0,j-1)sum+=s[i]-'0';
if (sum<=n&&!mark)
{
mark=true;
stack<int> S;
for (int i=len-1;i>=j;i--)
{
if (s[i]=='0'&&mark)S.push(0);
else if (s[i]!='0'&&mark)
{
mark=false;
S.push(10-(s[i]-'0'));
}
else if (!mark)S.push(9-(s[i]-'0'));
}
while(S.top()==0)S.pop();
while(!S.empty())
{
printf("%d",S.top());
S.pop();
}
puts("");
break;
}
}
}
}
}
E - Two Platforms
二分计算出以每一个顶点作为左端点可以接到的点的个数为len[i]
枚举左边的一段的位置,剩下的一段可以用后缀最大值来替代
(贪心:取定一段,剩下一段肯定越大越好)
一直更新答案即可
int t,n,k,a[maxn],b[maxn],r[maxn],len[maxn],maxx[maxn];
int main()
{
scanf("%d",&t);
while(t--)
{
int ans=0;
scanf("%d%d",&n,&k);
rep(i,1,n)scanf("%d",&a[i]);
rep(i,1,n)scanf("%d",&b[i]);
sort(a+1,a+1+n);
rep(i,1,n)
{
r[i]=a[i]+k;
int pos=distance(a,upper_bound(a+1,a+1+n,r[i]));
if (a[i]==a[i-1])len[i]=len[i-1];
else len[i]=min(pos,n+1)-i;
}
for (int i=n;i>=1;i--)
{
if (i==n)maxx[i]=len[i];
else maxx[i]=max(maxx[i+1],len[i]);
}
rep(i,1,n)
{
int pos=distance(a,upper_bound(a+1,a+1+n,r[i]));
ans=max(ans,len[i]+maxx[pos]);
}
W(ans);
rep(i,1,n)maxx[i]=0;
}
return 0;
}