首页 > 其他分享 >2020牛客暑期多校训练营(第五场)

2020牛客暑期多校训练营(第五场)

时间:2023-02-03 11:36:28浏览次数:39  
标签:return int 第五场 rep ans 多校 牛客 printf now


D Drop Voicing(dp)

题意:

有一个 2020牛客暑期多校训练营(第五场)_质因子分解

  1. 2020牛客暑期多校训练营(第五场)_最小公倍数_02:将倒数第二个数放到开头,前面的数向后平移
  2. 2020牛客暑期多校训练营(第五场)_数组_03:将倒数第二个数放到开头,前面的数向后平移

若干连续的 2020牛客暑期多校训练营(第五场)_最小公倍数_04 称为 2020牛客暑期多校训练营(第五场)_质因子分解_05。计算要使该排列排成 2020牛客暑期多校训练营(第五场)_质因子分解 所需的最少的 2020牛客暑期多校训练营(第五场)_质因子分解_05

2020牛客暑期多校训练营(第五场)_最小公倍数_08 可以把一个数转移到任意位置。比如对于序列 : 2020牛客暑期多校训练营(第五场)_质因子分解_09

我想把 2020牛客暑期多校训练营(第五场)_最小公倍数_10 移动到 2020牛客暑期多校训练营(第五场)_数组_11

  1. 进行两次 2020牛客暑期多校训练营(第五场)_数组_03 操作序列变成 2020牛客暑期多校训练营(第五场)_质因子分解_13
  2. 进行三次 2020牛客暑期多校训练营(第五场)_最小公倍数_02 操作序列变成 2020牛客暑期多校训练营(第五场)_数组_15
  3. 进行两次 2020牛客暑期多校训练营(第五场)_数组_03 操作序列变成 2020牛客暑期多校训练营(第五场)_最小公倍数_17

所以 2020牛客暑期多校训练营(第五场)_最小公倍数_18 的最少次数就是找到最长的一个环状 2020牛客暑期多校训练营(第五场)_最小公倍数_19 然后把其他元素插进去,这个环状是因为可以通过 2020牛客暑期多校训练营(第五场)_最小公倍数_20 操作改变序列的顺序,然后就是求每个位置往后的 2020牛客暑期多校训练营(第五场)_数组_21 长度 的 2020牛客暑期多校训练营(第五场)_最小公倍数_19 ,找到这些 2020牛客暑期多校训练营(第五场)_最小公倍数_19 的最大值用 2020牛客暑期多校训练营(第五场)_数组_21

AC代码:

const int N = 5e5 + 50;
int a[N], dp[N];
int n, m;

int main()
{
sd(n);
rep(i, 1, n)
{
sd(a[i]);
a[n + i] = a[i];
}
int ans = 0;
rep(pos, 1, n)
{
int sum = 0;
rep(i, pos, pos + n - 1)
dp[i] = 1;
rep(i, pos, pos + n - 1)
{
rep(j, pos, i - 1)
{
if (a[j] < a[i])
dp[i] = max(dp[i], dp[j] + 1);
}
sum = max(sum, dp[i]);
}
ans = max(ans, sum);
}
pd(n - ans);
return 0;
}

E Bogo Sort(大数,求环)

题意:

已知一个长度为 2020牛客暑期多校训练营(第五场)_数组_21 的序列 2020牛客暑期多校训练营(第五场)_质因子分解_26,用序列 2020牛客暑期多校训练营(第五场)_质因子分解_26 将排列 2020牛客暑期多校训练营(第五场)_最小公倍数_28 (未知)进行置换,要求找到排列使其被 2020牛客暑期多校训练营(第五场)_质因子分解_26

置换群,其实就是找环。比如 2020牛客暑期多校训练营(第五场)_质因子分解_262020牛客暑期多校训练营(第五场)_最小公倍数_312020牛客暑期多校训练营(第五场)_最小公倍数_282020牛客暑期多校训练营(第五场)_最小公倍数_31 ,那么 2020牛客暑期多校训练营(第五场)_最小公倍数_282020牛客暑期多校训练营(第五场)_质因子分解_26 置换一次后为 2020牛客暑期多校训练营(第五场)_数组_36 ,再被置换一次为 2020牛客暑期多校训练营(第五场)_最小公倍数_31 ,又变为了原数组,即 2020牛客暑期多校训练营(第五场)_质因子分解_38 构成一个环,2020牛客暑期多校训练营(第五场)_最小公倍数_39 自身构成一个环。
本题实际上就是要求出每个环的长度,然后求所有环的长度的 2020牛客暑期多校训练营(第五场)_数组_40

这道题给出的模数其实是迷惑人的,因为根本到不了怎么大,所以不用考虑,至于如何求多个数的 2020牛客暑期多校训练营(第五场)_数组_40

2020牛客暑期多校训练营(第五场)_数组_21

例如:求 2020牛客暑期多校训练营(第五场)_最小公倍数_43

  1. 2020牛客暑期多校训练营(第五场)_数组_44
  2. 2020牛客暑期多校训练营(第五场)_最小公倍数_45
  3. 2020牛客暑期多校训练营(第五场)_最小公倍数_46

2020牛客暑期多校训练营(第五场)_数组_11 中有一个 2020牛客暑期多校训练营(第五场)_最小公倍数_39,一个 2020牛客暑期多校训练营(第五场)_质因子分解_49;在 2020牛客暑期多校训练营(第五场)_最小公倍数_39 中有两个 2020牛客暑期多校训练营(第五场)_最小公倍数_39 ,一个 2020牛客暑期多校训练营(第五场)_数组_52;在 2020牛客暑期多校训练营(第五场)_数组_52 式中有两个2020牛客暑期多校训练营(第五场)_最小公倍数_39

所以 2020牛客暑期多校训练营(第五场)_最小公倍数_39 最多有两个,2020牛客暑期多校训练营(第五场)_数组_52最多有一个,2020牛客暑期多校训练营(第五场)_质因子分解_49 最多有一个;最后 2020牛客暑期多校训练营(第五场)_数组_58

所以先把每个环的质因子分解出来,然后取幂次最高的那个,然后把所有质因子按照幂次都乘上即可。

AC代码:

const int N = 4e5 + 50;
int n, m;
int a[N], vis[N];
int cnt[N];
vector<int> v;

namespace bigI
{
typedef vector<ll> VI;
const int bas = 1e4;

void print(VI A)
{
if (A.size() == 0)
return;
printf("%lld", A.back());
for (int i = A.size() - 2; i >= 0; --i)
printf("%04lld", A[i]);
puts("");
}

VI mul(VI A, ll b)
{
static VI C;
C.clear();
ll t = 0;
for (int i = 0; i < (int)A.size() || t; ++i)
{
if (i < (int)A.size())
t += A[i] * b;
C.push_back(t % bas);
t /= bas;
}
return C;
}
} // namespace bigI
using namespace bigI;

int dfs(int p)
{
if (vis[p])
return 0;
vis[p] = 1;
return dfs(a[p]) + 1;
}//找环

int main()
{
sd(n);
rep(i, 1, n)
sd(a[i]);
rep(i, 1, n)
{
if (vis[i])
continue;
int x = dfs(i);
v.pb(x);
}
for (auto i : v)
{
int now = i;
int res = 0;
for (int j = 2; j * j <= now; j++)
{
res = 0;
while (now % j == 0)
res++, now = now / j;
cnt[j] = max(cnt[j], res);
}
if (now > 1)
cnt[now] = max(cnt[now], 1);
}
VI ans = {1};
rep(i, 2, n)
{
while (cnt[i])
{
ans = mul(ans, i);
cnt[i]--;
}
}
print(ans);
return 0;
}

F DPS(签到)

题意:

编写一个程序,输出显示对敌人造成伤害的直方图,其中空格的长度为 2020牛客暑期多校训练营(第五场)_质因子分解_59 (向上取整),必须通过将最后一个空格替换为 2020牛客暑期多校训练营(第五场)_最小公倍数_60

这个思路很明显,按照题意模拟就行,注意精度问题。

AC代码:

const int N = 2e5 + 50;
int d[110];
int main()
{
int n;
sd(n);
rep(i, 1, n)
sd(d[i]);
int maxn = 0;
rep(i, 1, n)
maxn = max(maxn, d[i]);
rep(i, 1, n)
{
int len = ceil(50.0 * d[i] / maxn);
printf("+");
rep(j, 1, len)
printf("-");
printf("+");
puts("");
printf("|");
rep(j, 1, len - 1)
printf(" ");
if (d[i])
printf("%c", (d[i] == maxn) ? '*' : ' ');
printf("|%d\n", d[i]);
printf("+");
rep(j, 1, len)
printf("-");
printf("+");
puts("");
}
return 0;
}

I Hard Math Problem

题意:

给出一个 2020牛客暑期多校训练营(第五场)_最小公倍数_61 的网格,每个格子可放 2020牛客暑期多校训练营(第五场)_质因子分解_62 中的一个,要求 2020牛客暑期多校训练营(第五场)_最小公倍数_63 的上下左右至少要有一个 2020牛客暑期多校训练营(第五场)_数组_64 和一个 2020牛客暑期多校训练营(第五场)_数组_65 ,问 2020牛客暑期多校训练营(第五场)_数组_66 都取无穷大时放 2020牛客暑期多校训练营(第五场)_最小公倍数_63

取一条斜线,在斜线上交错摆 2020牛客暑期多校训练营(第五场)_数组_642020牛客暑期多校训练营(第五场)_数组_65,这样斜线之上和之下的两条斜线都可以摆放 2020牛客暑期多校训练营(第五场)_最小公倍数_63,则占比为2020牛客暑期多校训练营(第五场)_数组_71

GHGHGH
HEHEHE
GHGHGH
HEHEHE
GHGHGH
HEHEHE

AC代码:

int main()
{
double ans=2.0/3.0;
printf("%.6lf\n",ans);
return 0;
}


标签:return,int,第五场,rep,ans,多校,牛客,printf,now
From: https://blog.51cto.com/u_15952369/6035722

相关文章