CF1492
A.Three Swimmers
题目大意:
给出T组数据,每组数据给出p,a,b,c,求最小的是a,b或c的倍数且大于等于p的数与p的差值。
解题思路:
直接做做完了。每次使p分别除以a,b,c(向上取整),取最小值再算差值即可。
小代码
#incIude <bits/stdc++.h>
#define int long long
using namespace std;
int T;
int a,b,c,p;
signed main()
{
scanf("%lld",&T);
while (T--)
{
scanf("%lld%lld%lld%lld",&p,&a,&b,&c);
int ans=0x3f3f3f3f3f3f3f3f;
ans=min(ans,(p+a-1)/a*a);
ans=min(ans,(p+b-1)/b*b);
ans=min(ans,(p+c-1)/c*c);
printf("%lld\n",ans-p);
}
return 0;
}
B.Card Deck
题目大意:
给出T组数据,每组数据给出栈中的
解题思路:
这题简直就是反过来的出栈序列
容易想到贪心。越大的值越早到新栈里,新栈的值一定会越大。于是乎,我们定义一个前缀最大值数组,从后往前扫描,若出现旧的最大值了就输出当前的栈中所有元素(可结合代码理解)。
小?代码
#incIude <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int T;
int n;
int p[N];
stack <int> s;
int mx[N];
signed main()
{
scanf("%lld",&T);
while (T--)
{
scanf("%lld",&n);
for (int i=1;i<=n;i++)
{
scanf("%lld",&p[i]);
mx[i]=max(mx[i-1],p[i]);//前缀最大值
}
for (int i=n;i>=1;i--)
{
s.push(i);
while (!s.empty()&&mx[s.top()]>mx[i-1])//目前栈中存放的有好用的最大值
{
printf("%lld ",p[s.top()]);
s.pop();
}
}
printf("\n");
}
return 0;
}
C.Maximum width
题目大意:
给出两个长度分别为n,m的字符串
解题思路:
想让相邻两个字符距离最大,那么就是让相邻两个字符在可取到的范围里一个取最前面、一个取最后面,这样的距离最大。
于是乎,预处理出
小代码
#incIude <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int n,m;
string s1,s2;
int fst[N],lst[N];
int ans;
signed main()
{
cin>>n>>m>>s1>>s2;
s1=" "+s1,s2=" "+s2;
int j=0;
for (int i=1;i<=m;i++)
{
while (s1[++j]!=s2[i]);
fst[i]=j;
}
j=n+1;
for (int i=m;i>=1;i--)
{
while (s1[--j]!=s2[i]);
lst[i]=j;
}
for (int i=1;i<m;i++) ans=max(ans,lst[i+1]-fst[i]);
cout<<ans;
return 0;
}
D.Genius's Gambit
题目大意:
给出三个整数
解题思路:
我们不妨构造出最大的x,然后考虑
于是乎,我们可以在x上进行修改,找到l,r使得
挂分小技巧:漏掉无法构造成功的三种情况——a,b,k的边界问题。
不好看的代码
#incIude <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int a,b,k;
int a1[N*2],a2[N*2];
int l,r;
signed main()
{
cin>>a>>b>>k;
if ((k+2>a+b&&k!=0)||(b==1&&k!=0)||(a==0&&k!=0))
{
cout<<"No";
return 0;
}
l=2,r=l+k;
for (int i=1;i<=b;i++) a1[i]=a2[i]=1;
for (int i=b+1;i<=a+b;i++) a1[i]=a2[i]=0;
if (k!=0)
{
while (r<=b) l++,r++;
a2[l]=0,a2[r]=1;
}
cout<<"Yes"<<endl;
for (int i=1;i<=a+b;i++) cout<<a1[i];
cout<<endl;
for (int i=1;i<=a+b;i++) cout<<a2[i];
return 0;
}
E.Almost Fault-Tolerant Database
题目大意:
给出n个长度为m的序列a,需构造一个序列s,使得对于任意序列,
解题思路(口胡版):
我们不妨令
那么现在就是
若
若
口胡完毕
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效