『CSVP-J』CSP-J 信心赛 题解

题目难度

orangeorangeyellowyellow\color{orange}orange\color{black}-\color{orange}orange\color{black}-\color{#ffc116}yellow\color{black}-\color{#ffc116}yellow

T1 星战

Pro

判断 x!x! 是否是 i=1xi\sum\limits_{i=1}^x i 的倍数。

Sol

Subtask 1

因为 xx 不大,用 __int128 或者高精即可。

Subtask 2

推式子。

x!x! 除以 i=1xi\sum\limits_{i=1}^x i,得到 x!x(x+1)2=2(x1)!x+1\dfrac{x!}{\frac{x(x+1)}{2}}=\dfrac{2(x-1)!}{x+1}

原题转化为 2(x1)!2(x-1)! 是否是 x+1x+1 的倍数。

容易发现,如果 x+1x+1 是合数,就一定有解。然后特判 x+1=2x+1=2 即可。

时间复杂度 O(Tn)O(T\sqrt{n})

Subtask 3

改成质数筛即可。时间复杂度 O(n+T)O(n+T)

T2 密码锁

Pro

删除最少的数,使得 aik×aja_i\le k\times a_j

Sol

Subtask 1

枚举 l,rl,r,求出区间最大值与最小值,k×mink\times minmaxmax 的关系即可。

时间复杂度 O(n3)O(n^3)

Subtask 2

ST 表维护最大值,时间复杂度 O(n2)O(n^2)

Subtask 3

  • k=1k=1 时,求出出现最多的数字次数。
  • k=2k=2 时,判断删 11 或者删 22
  • k=3k=3 时,输出 00

Subtask 4

考虑枚举左端点,二分右端点,时间复杂度 O(nlogn)O(n\log n)

Subtask *

本题还可以双指针等其他做法,时间复杂度 O(nlogn)O(n\log n)

T3 动物园

Pro

每一次拿一排没有拿过的,先手要和最大,后手要和最小,问最后石子个数。

Sol

Subtask 1

求出 linemax1,linemax2,linemin1,linemin2\text{linemax}_1,\text{linemax}_2,\text{linemin}_1,\text{linemin}_2,比较 max{linemax1+linemin2,linemin1+linemax2}\max\{\text{linemax}_1+\text{linemin}_2,\text{linemin}_1+\text{linemax}_2\} 即可。

Subtask 2

取每一行最大值,每一行最小值。记录它们的差。

显然每一行至少拿 minline\min line。显然史莱姆获得的利益为 linemaxlineminlinemax-linemin。对差值排序即可。

Subtask 3

只需要记录每一行最大值、每一行最小值、差即可。

T4

Sol

Subtask 1

搜索。

Subtask 2

求出最小列车需要修改的值,修改即可。

Subtask 3

假设求出了最小列车需要修改的值,这就变成了一道背包 DP。物品价值 costicost_i,物品重量 kik_i。求最小价值。模板。

for(int i=1;i<=m;i++)
{
  int cost,k,op;
  cin>>cost>>k>>op;
  if(op==0)
    for(int j=0;j<=sum;j++)
      f[j]=min(f[j],f[max(0ll,j-k)]+cost);
  else
    for(int j=sum;j>=0;j--)
      f[j]=min(f[j],f[max(0ll,j-k)]+cost);
}
posted @ 2024-10-25 13:26  sLMxf  阅读(27)  评论(0)    收藏  举报  来源