日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

2021牛客寒假算法基础集训营1

發(fā)布時(shí)間:2023/12/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2021牛客寒假算法基础集训营1 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2021牛客寒假算法基礎(chǔ)集訓(xùn)營(yíng)1

  • A. 串(線性DP)
  • B. 括號(hào)(構(gòu)造)
  • E.三棱錐之刻(幾何)
  • F. 對(duì)答案一時(shí)爽(簽到)
  • I. 限制不互素對(duì)的排列(構(gòu)造)
  • J. 一群小青蛙呱蹦呱蹦呱

A. 串(線性DP)

f[i][0]f[i][0]f[i][0] :表示字符串前i個(gè)字符中既沒(méi)有’u’也沒(méi)有’s’;
f[i][1]f[i][1]f[i][1] :表示字符串前i個(gè)字符中有’u’沒(méi)有’s’;
f[i][2]f[i][2]f[i][2] :表示字符串前i個(gè)字符中含有’u’也有’s’;

初始化:
f[1][0]f[1][0]f[1][0] = 25; // 第1項(xiàng)不是’u’,那么就有25種選擇
f[1][1]f[1][1]f[1][1] = 1; // 第1項(xiàng)是’u’,那么就只能是1種選擇,就是’u’
f[1][2]f[1][2]f[1][2] = 0; // 第1項(xiàng)是不可能同時(shí)存在u和s,所以 f[1][2]=0f[1][2]=0f[1][2]=0

狀態(tài)轉(zhuǎn)移方程:
如果前i項(xiàng)既不含’u’也不含’s’,那么前i-1項(xiàng)也不會(huì)含’u’和’s’;
f[i][0]=(25×f[i?1][0])%MODf[i][0] = (25 × f[i-1][0])\% MODf[i][0]=25×f[i?1][0]%MOD

如果前i項(xiàng)含有’u’不含’s’,那么有兩種情況
① 第i項(xiàng)是’u’,那么:f[i?1][0]f[i-1][0]f[i?1][0]
② 第i項(xiàng)不是’u’,且要保證第i項(xiàng)不是’s’,那么就有25個(gè)選擇:25×f[i?1][1]25 × f[i-1][1]25×f[i?1][1]
把這兩種情況加起來(lái)結(jié)果

如果前i項(xiàng)含有’u’也含有’s’,那么也有兩種情況
① 第i項(xiàng)是’s’,那么之前有’u’,轉(zhuǎn)移方程就是:f[i?1][1]f[i-1][1]f[i?1][1]
② 第i項(xiàng)不是’s’,第i項(xiàng)有26種選擇,f[i?1][2]×26f[i-1][2] × 26f[i?1][2]×26

綜上:

f[i][0] = (25 * f[i - 1][0]) % MOD; f[i][1] = (25 * f[i - 1][1] + f[i - 1][0]) % MOD; f[i][2] = (f[i - 1][1] + f[i - 1][2] * 26) % MOD; #include<bits/stdc++.h> #define int long long using namespace std; const int N = 1000010; const int MOD = 1e9 + 7; int n, ans; int f[N][4]; signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> n;f[1][0] = 25;f[1][1] = 1;f[1][2] = 0;for (int i = 2; i <= n; i++) {f[i][0] = (25 * f[i - 1][0]) % MOD;f[i][1] = (25 * f[i - 1][1] + f[i - 1][0]) % MOD;f[i][2] = (f[i - 1][1] + f[i - 1][2] * 26) % MOD;ans = (ans + f[i][2]) % MOD;}cout << ans << endl;return 0; }

B. 括號(hào)(構(gòu)造)

題意:
本題是一個(gè)構(gòu)造題,需要構(gòu)造一個(gè)形如:
a × b + c的形式
如11
11 = 3 × 3 + 2
因?yàn)橛疫呉纬梢粋€(gè)2,所以將 a×b+ca×b+ca×b+c 變換形式:變成 a×(b?1)+c+ba × (b - 1) + c + ba×(b?1)+c+b
這樣子就能滿足題意了:
舉幾個(gè)例子:
如果是 11 的時(shí)候: 3 × 3 + 2;
如果是 101 的時(shí)候:10 × 10 + 1;

① 求出一個(gè) aaa,使得 a2a^2a2 是盡可能接近 kkk 的,aaa = k\sqrt{k}k?

② 此時(shí)的 a2a^2a2 == kkk 不一定成立,而且如果將后面全部劃分給c的話,如果k == 1e9的話,會(huì)爆長(zhǎng)度1e5

③ res:表示除去 a2a^2a2 之后還有多少,res=k?a2res = k - a^2res=k?a2;

④ 從剩下的中再維護(hù)出一個(gè) ?resa??\frac{res}{a}??ares??,防止爆長(zhǎng)度。
即:b = ?resa?+a?\frac{res}{a}? + a?ares??+a

⑤ 此時(shí)還剩下 resresres % aaa 的即, ccc = resresres % aaa

綜上所述:
a=k,res=k?a?a,b=?resa?+a,c=res%aa = \sqrt{k}, res = k - a * a, b = ?\frac{res}{a}? + a, c = res \;\%\; aa=k?,res=k?a?a,b=?ares??+a,c=res%a

#include<bits/stdc++.h> #define int long long using namespace std; signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int k;cin >> k;if (k == 0) {cout << ")(" << endl;return 0;} int a = sqrt(k), res = ceil(k - (a * a)), b = res / a + a, c = res % a; // cout << a << ' ' << res << ' ' << b << ' ' << c << endl;for (int i = 1; i <= a; i++) cout << '(';for (int i = 1; i <= b - 1; i++) cout << ')';for (int i = 1; i <= c; i++) cout << '(';cout << ')' << endl;return 0; }

E.三棱錐之刻(幾何)

P為正三棱錐內(nèi)部的中心,PA,PD為正三棱錐外接球半徑,OP為正三棱錐內(nèi)切球半徑

結(jié)論:已知正三棱錐的棱長(zhǎng)為a,那么正三棱錐外接球半徑為:64a\frac{\sqrt{6}}{4}a46??a ,正三棱錐內(nèi)切球半徑為:612a\frac{\sqrt{6}}{12}a126??a

//minn為正三棱錐內(nèi)切球半徑,maxx為正三棱錐外接球半徑 double minn = sqrt(6.0) * a / 12, maxx = sqrt(6.0) * a / 4; double area;

本題分三種情況:

  • 當(dāng)染色半徑 r≤612ar ≤ \frac{\sqrt{6}}{12}ar126??a時(shí), 即染色球還未觸及正三棱錐內(nèi)壁,那么就無(wú)法染色
  • if (r <= minn) area = 0;//無(wú)法染色,染色面積自然為0
  • 當(dāng)染色半徑 r≥64ar ≥ \frac{\sqrt{6}}{4}ar46??a時(shí), 即染色球已經(jīng)包含整個(gè)正三棱錐,那么整個(gè)正三棱柱的內(nèi)部都會(huì)染色
  • else if (r >= maxx) area = sqrt(3.0) / 4 * f(a);//正三棱錐一個(gè)側(cè)面三角形的面積
  • 當(dāng)染色半徑 612a≤r≤64a\frac{\sqrt{6}}{12}a ≤ r ≤ \frac{\sqrt{6}}{4}a126??ar46??a 時(shí),分為兩個(gè)小情況:
    (1) 當(dāng)橫截面積 ≤ 是三角形的內(nèi)切圓 即 橫截圓的半徑 ≤ 36a\frac{\sqrt{3}}{6}a63??a
  • 此時(shí)OG為底面三角形ABC的內(nèi)切圓,OG為內(nèi)切圓的半徑為:d=36ad = \frac{\sqrt{3}}{6}ad=63??a ,染色圓的半徑為:r

    那么染色球與其中一個(gè)底面三角形ABC形成的橫截圓的半徑為:r1=(r?612a)2?d2r_1 = \sqrt{(r - \frac{\sqrt{6}}{12}a)^2 - d^2}r1?=(r?126??a)2?d2?

    所以:此時(shí)底面三角形ABC染色面積為:πr12πr_1^2πr12? ,有4個(gè)面就是 4πr124πr_1^24πr12?

    (2) 當(dāng) 正三角形的內(nèi)切圓 < 橫截圓 < 正三角形的外接圓 即 染色的面積如藍(lán)色陰影部分:

    這個(gè)面積分為兩個(gè)部分:等腰三角形+扇形

    此時(shí)的 r1,d,2dr_1, d, 2dr1?,d,2d 如圖所示

    3個(gè)等腰三角形面積 = r12?d2×d×3\sqrt{r_1^2-d^2} × d × 3r12??d2?×d×3

    扇形的弧度:α=(2π?acos(dr1)×2×3)÷3α = (2π - acos(\fracozvdkddzhkzd{r_1} )× 2 × 3) ÷ 3α=(2π?acos(r1?d?)×2×3)÷3

    3個(gè)扇形面積 = α2π×π×r12×3\frac{α}{2π} × π × r_1^2 × 32πα?×π×r12?×3

    else {if (r1 <= d) {area = PI * r1 * r1;} else {double area1 = sqrt(f(r1) - f(d)) * d * 3;//3個(gè)等腰三角形的面積//cos() 是已知一個(gè)角的弧度值 x,求該角的余弦值 y;而 acos() 是已知一個(gè)角的余弦值 y,求該角的弧度值 x。//扇形面積 = ((2 * PI - 三個(gè)等腰三角形的角度) * 3 / 3) / (PI * 2) * PI * f(r1);double area2 = ((((PI * 2) - (acos(d / r1) * 2) * 3) / 3) / (PI * 2)) * PI * f(r1);area = area1 + area2; }}

    完整的AC代碼:

    #include<cstdio> #include<iostream> #include<cstring> #include<string> #include<cmath> #include<algorithm> #define ll long long #define int ll #define PI acos(-1) #define MOD 1000000007 using namespace std; int read() {int w = 1, s = 0;char ch = getchar();while (ch < '0' || ch>'9') { if (ch == '-') w = -1; ch = getchar(); }while (ch >= '0' && ch <= '9') { s = s * 10 + ch - '0';ch = getchar(); }return s * w; } //x的平方 double f(double x) {return x * x; } signed main() {double a;//題目給的正三棱錐的棱長(zhǎng)double r;//題目給的染色的半徑scanf("%lf%lf", &a, &r);// sqrt(6) * a / 12;是正三棱柱內(nèi)切球的半徑// sqrt(6) * a / 4; 是正三棱柱外接球的半徑double minn = sqrt(6.0) * a / 12, maxx = sqrt(6.0) * a / 4;/*本題分三種情況:Ⅰ. 當(dāng)染色半徑 r <= sqrt(6) * a / 12; 那么就無(wú)法染色Ⅱ. 當(dāng)染色半徑 r >= sqrt(6) * a / 4; 那么整個(gè)正三棱柱的內(nèi)部都會(huì)染色Ⅲ. 當(dāng)染色半徑 sqrt(6) * a / 12 < r < sqrt(6) * a / 4 時(shí)分為兩個(gè)小情況:(1) 當(dāng)橫截面積 恰好是三角形的內(nèi)切圓(2) 當(dāng)橫截面積 大于正三角形的內(nèi)切圓 小于正三角形的外接圓*/double r1 = sqrt(f(r) - f(sqrt(6.0) * a / 12));//在正三棱錐的一個(gè)側(cè)面被染色截面圓的半徑double d = sqrt(3.0) / 6 * a;//正三角形的內(nèi)切圓的半徑double area;if (r <= minn) area = 0;else if (r >= maxx) area = sqrt(3.0) / 4 * f(a);//正三棱錐一個(gè)側(cè)面三角形的面積else {if (r1 <= d) {area = PI * r1 * r1;} else {double area1 = sqrt(f(r1) - f(d)) * d * 3;//3個(gè)等腰三角形的面積//cos() 是已知一個(gè)角的弧度值 x,求該角的余弦值 y;而 acos() 是已知一個(gè)角的余弦值 y,求該角的弧度值 x。double area2 = 3 * ((((PI * 2) - (acos(d / r1) * 2) * 3) / 3) / (PI * 2)) * PI * f(r1);//扇形面積 = ((2 * PI - 三個(gè)等腰三角形的角度) * 3 / 3) / PI * 2 * PI * f(r1);area = area1 + area2;}}printf("%.6lf\n", area * 4);return 0; }

    F. 對(duì)答案一時(shí)爽(簽到)

    #include<bits/stdc++.h> #define int long long using namespace std; const int N = 200010; char a[N], b[N]; signed main() {ios::sync_with_stdio(false);cout.tie(0);cin.tie(0);int n;cin >> n;for (int i = 1; i <= n; i++) cin >> a[i];for (int i = 1; i <= n; i++) cin >> b[i];int same = 0, usame = 0;for (int i = 1; i <= n; i++) {if(a[i] == b[i] && a[i] != ' ') same++;}printf("%lld 0\n", same + n);return 0; }

    I. 限制不互素對(duì)的排列(構(gòu)造)

    題意:給定n,k,長(zhǎng)度為n的序列,使得其中正好有 k 對(duì)相鄰的數(shù)gcd(最大公約數(shù))大于 1

    題解:
    一般簡(jiǎn)單的構(gòu)造題,都會(huì)有一個(gè)萬(wàn)能的解法,邊界需要特殊判斷。
    這道題需要多次嘗試,得出結(jié)論
    ① 在n == 4 && k == 1時(shí),輸出:1 4 2 3 或者 1 2 4 3
    ② 在n == 5 && k == 1時(shí),輸出:1 4 2 3 5 或者 1 2 4 3 5
    ③ 在n >= 6時(shí),就有一個(gè)萬(wàn)能公式:
    這個(gè)萬(wàn)能公式,其實(shí)題目有提示:0≤k≤n20 ≤ k ≤ \frac{n}{2}0k2n?
    最多只有 n2\frac{n}{2}2n? 對(duì) 不互素對(duì)。

    以 示例2 為例子:
    那么3 6首先是一對(duì),后面的話 6和2,2和4
    所以,結(jié)果也可以是:3 6 2 4 1 5
    那么觀察這個(gè)例子:
    長(zhǎng)度為6,我們先構(gòu)造了一對(duì) 3 6 ,而后枚舉偶數(shù)即可,偶數(shù)與偶數(shù)之間一定存在一個(gè)公約數(shù)2,枚舉偶數(shù)只需要枚舉k-1個(gè)就行了,枚舉一個(gè)就用 st[ ] 數(shù)組標(biāo)記一個(gè),最后把剩下長(zhǎng)度的順序輸出即可。
    這里看個(gè)例子就懂了:

    其余的情況就輸出 -1

    #include<bits/stdc++.h> #define int long long using namespace std; const int N = 100010; bool st[N]; signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n, k;cin >> n >> k;if (k == 0) {for (int i = 1; i <= n; i++) cout << i << ' ';cout << endl;return 0;}if (n == 4 && k == 1) {cout << "1 4 2 3" << endl;} else if (n == 5 && k == 1) {cout << "1 4 2 3 5" << endl;} else if (n >= 6) {cout << "3 6 ";st[3] = st[6] = 1;for (int i = 1; i <= k - 1; i++) {if (i == 3) {k++;continue;}cout << 2 * i << ' ';st[2 * i] = 1;}for (int i = 1; i <= n; i++) {if (!st[i]) {cout << i << ' ';if (i == 2) {cout << 5 << ' ';st[i] = 5;}}}cout << endl;} else {cout << "-1" << endl;}return 0; }

    J. 一群小青蛙呱蹦呱蹦呱

    題意:要我們算出除了(2k)(3k)…(4k)(2^k)(3^k)…(4^k)(2k)(3k)(4k) 的所有數(shù)字的最小公倍數(shù)lcm。

    總結(jié)

    以上是生活随笔為你收集整理的2021牛客寒假算法基础集训营1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。