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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Journey to Un‘Goro 贪心,找规律,搜索(沈阳)

發布時間:2025/3/19 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Journey to Un‘Goro 贪心,找规律,搜索(沈阳) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


題意 :

  • 讓我們構造一個長度為n的只包含’b’和‘r’的字符串,要求所構造的字符串的子序列滿意的個數最多
  • 滿意的定義:對于序列[l,r],其中’r’出現的個數是奇數,那么就是滿意的
  • 按字典序輸出前100個

思路 :

  • 找最大對數,肯定是全r最優,直接計算即可
  • 首先需要求[l,r][l,r][l,r]內‘r’的個數,可以想到前綴和
  • 我們定義數組g[N]g[N]g[N]g[i]g[i]g[i]表示字符串前i位里r出現的個數
  • 那么對于序列[l,r][l,r][l,r],r出現的個數就是g[r]?g[l?1]g[r] - g[l - 1]g[r]?g[l?1]
  • 只有g[r]g[r]g[r]g[l?1]g[l - 1]g[l?1]的奇偶性不一致時,r出現的個數會是奇數,該字符串才滿意
  • 設這些前綴和中有x個奇數,y個偶數,則滿足x+y=nx+y=nx+y=n,且此時我們的答案就是x?yx*yx?y
  • 則由均值不等式x+y≥2xyx + y \geq 2\sqrt{xy}x+y2xy?得到xy≤(x+y2)2xy \leq (\frac{x+y}{2})^2xy(2x+y?)2,當且僅當x=y時取等號
  • x=y=n2x=y=\frac{n}{2}x=y=2n?時,答案最大
  • 因為只需要輸出前100個,搜索即可
  • x*y為n+12?n+22\frac{n+1}{2} * \frac{n+2}{2}2n+1??2n+2?,x和y分別不能超過n+22\frac {n+2}{2}2n+2?
  • dfs傳入四個參數,當前字符串的第i位,當前字符串的前綴和為奇數的個數,為偶數的個數,前i-1位r的個數
  • dfs時首先判斷已經輸出字符串的個數和前綴和分別為奇數偶數的個數
  • 然后是判斷當前這位是否已經第n位
  • 再根據前i-1位r的個數分別dfs
  • 觀察樣例1,n=1時,輸出"r",第0位以前的‘r’的個數的前綴和是0,偶數,因此dfs第一次傳入參數在第二個位置應為1
  • 字典序最小表現在每次dfs都是先放b后放r的
  • 注意要開long long,因為輸出個數時溢出了
#include <iostream> #include <algorithm> #include <cstring> #include <queue> #define debug(a) cout << #a << " = " << a << endl; #define x first #define y second using namespace std; typedef long long ll;const int N = 1e5 + 10;ll n; ll out; ll cnt = 0; char s[N];// 字符串中第i位,前綴和偶數個數,前綴和奇數個數,字符串前i-1位r的個數 void dfs(ll i, ll even, ll odd, ll last) {// 輸出100個,或者奇數或偶數數量超限if (cnt >= 100 || even > out || odd > out)return ;// 一個字符串完成if (i == n){cnt ++ ;cout << s << endl;return ;}if (last % 2 == 0) // 字符串前i-1位r的個數是偶數{s[i] = 'b';dfs(i + 1, even + 1, odd, last); // 在第i位放'b',前綴和為偶數的個數加一,為奇數的個數不變s[i] = 'r';dfs(i + 1, even, odd + 1, last + 1);}else // 字符串前i-1位r的個數是奇數{s[i] = 'b';dfs(i + 1, even, odd + 1, last);s[i] = 'r';dfs(i + 1, even + 1, odd, last + 1);} }int main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);cin >> n;cout << ((n + 1) / 2) * ((n + 2) / 2) << endl;// LL ans = 1;// LL tmp = 1;// for(int i = 2; i <= n; i ++ )// {// if(i % 2) tmp ++;// ans += tmp;// }// m = (n + 2) / 2;// cout << ans << endl;out = (n + 2) / 2;dfs(0, 1, 0, 0);return 0; }

總結

以上是生活随笔為你收集整理的Journey to Un‘Goro 贪心,找规律,搜索(沈阳)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。