牛客周賽 Round 34(A,B,C,D,E,F,G)

把這場忘了。。官方也遲遲不發題解

比賽鏈接

出題人題解


A 小紅的字符串生成

思路:

枚舉四種字符串打印出來即可,為了防止重復可以用set先去一下重。

code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
using namespace std;set<string> S;
string a,b;int main(){cin>>a>>b;S.insert(a);S.insert(b);S.insert(a+b);S.insert(b+a);cout<<S.size()<<endl;for(auto x:S)cout<<x<<endl;return 0;
}

B 小紅的非排列構造

思路:

如果它本身就不是一個排列,那么就不需要修改,如果是排列,我們就換一個不是排列中的數進去,那么它就一定不是排列了。

判定是否為排列的方法很多,我是先排序再去重,然后看一下兩頭的數是不是1和n就行了

code:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1e5+5;int n,a[maxn],cnt;int main(){cin>>n;for(int i=1;i<=n;i++)cin>>a[i];sort(a+1,a+n+1);cnt=unique(a+1,a+n+1)-a-1;if(cnt==n && a[1]==1 && a[n]==n)printf("1\n1 1000000");else printf("0");return 0;
}

C 小紅的數字拆解

思路:

看半天沒看懂,原來是切割數位啊😅

觀察一下不難發現,如果想要切割出來的數是個偶數,那么就需要個數為偶數,高位無所謂。而我們要盡可能切出來最多偶數,所以奇數一定和和它右邊遇到的第一個偶數進行結合。

切割方法找到了,現在問題變成了怎么存,怎么排序。一般想法是用string存,并用string內置的排序辦法。但是string排序默認是字典序排序而不是數字的先比數位。于是用結構體存一個string,并重載一下排序辦法就可以了。

code:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <set>
#include <string>
using namespace std;string str,t;
struct Str{string s;Str(string x):s(x){};bool operator<(const Str x)const{if(s.size()==x.s.size())return s<x.s;return s.size()<x.s.size();}
};
multiset<Str> S;int main(){cin>>str;for(auto x:str){t+=x;if(~(x-'0')&1){S.insert(Str(t));t.clear();}}for(auto x:S)cout<<x.s<<endl;return 0;
}

D 小紅的陡峭值

思路:

手玩一會不難發現:中間的 0 0 0 都是沒用的。

如果中間的 0 0 0 都取兩邊其一的數,那么中間的 0 0 0 就可以看作沒有。而如果都不取,差值勢必大于1,直接就不滿足條件了。因此為了滿足條件,中間的 0 0 0 就只能取一邊的數,就相當于沒用。

現在有用的只有兩端的 0 0 0。我們用兩個 b o o l bool bool 變量 f 1 , f 2 f1,f2 f1,f2 記錄一下開頭和結尾有無 0 0 0,然后直接把原序列中所有的 0 0 0 全部去掉(或者直接先替換成一端的數)。問題變成了現在要如何填數?

發現需要求一下中間的數的陡峭值是多少,如果是 0 0 0,就需要兩端的 0 0 0 來補,如果是 1 1 1,就不需要兩端有 0 0 0,如果大于 1 1 1,直接無解。

code:

#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=1e5+5;int n,a[maxn],cnt;int main(){cin>>n;if(n==1){printf("-1");return 0;}int flag=0;for(int i=1,t;i<=n;i++){cin>>a[i];if(a[i]==0){if(i==1)flag=1;else if(i==n)flag=2;//兩端有一端有就行了,所以用了一個變量a[i]=a[i-1];}}if(a[n]==0)a[n]=5;for(int i=n;i>=1;i--)if(a[i]==0)a[i]=a[i+1];int tot=0;for(int i=2;i<=n;i++)tot+=abs(a[i]-a[i-1]);if(tot==0 && flag){if(flag==1)a[1]=(a[2]==1)?2:a[2]-1;else if(flag==2)a[n]=(a[n-1]==1)?2:a[n-1]-1;for(int i=1;i<=n;i++)printf("%d ",a[i]);}else if(tot==1){for(int i=1;i<=n;i++)printf("%d ",a[i]);}else printf("-1");return 0;
}

E 小紅的樹形 dp

思路:

一開始的思路是:把一個點欽定為根節點,那么每個點的深度就確定了,如果某個點的值確定,那么對應奇數和偶數深度的點就確定了,然后巴拉巴拉。

不過不用那么麻煩,因為一個點確定了,其他點就隨之確定了,因此我們直接遍歷一下有沒有d或p,如果有,就以它為根節點開始往下填數,如果出現了沖突的點就無解。如果沒有d或p,就隨便填了。

code:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=1e5+5;int n;
string color;int head[maxn],cnt;
struct edge{int v,nxt;
}e[maxn<<1];
void add(int u,int v){e[++cnt].v=v;e[cnt].nxt=head[u];head[u]=cnt;
}void dfs(int u,int rt){for(int i=head[u],v;i;i=e[i].nxt){v=e[i].v;if(v==rt)continue;if(color[v]==color[u]){printf("-1");exit(0);}color[v]=(color[u]=='d')?'p':'d';dfs(v,u);}
}int main(){cin>>n>>color;color=" "+color;for(int i=1,u,v;i<n;i++){cin>>u>>v;add(u,v);add(v,u);}if(color.find_first_of("dp",1)!=string::npos)dfs(color.find_first_of("dp",1),-1);else {color[1]='d';dfs(1,-1);}cout<<color.substr(1);return 0;
}

F 小紅的矩陣構造

思路:

就是很固定的構造方式,官方講解講的已經很明白了,在視頻一小時九分那里。大概就是這個樣子:

在這里插入圖片描述

注意 n , m ≥ 4 n,m\ge 4 n,m4 x x x 是偶數。

code:

#include <iostream>
#include <cstdio>
using namespace std;int n,m,x;
int a[5][5];int main(){cin>>n>>m>>x;if(x==2)cout<<-1<<endl;else if(x%4==0){a[1][1]=a[1][2]=a[2][1]=a[2][2]=x/4;for(int i=1;i<=n;i++,puts(""))for(int j=1;j<=m;j++){if(i>4 || j>4)printf("0 ");else printf("%d ",a[i][j]);}}else {x-=6;a[1][1]=a[1][2]=a[2][1]=a[2][2]=x/4;a[3][2]=a[2][3]=a[3][3]=a[2][4]=a[4][2]=a[4][4]=1;for(int i=1;i<=n;i++,puts(""))for(int j=1;j<=m;j++){if(i>4 || j>4)printf("0 ");else printf("%d ",a[i][j]);}}return 0;
}

G 小紅的元素交換

思路:

用到了置換環這個小知識點。將排列打亂,然后給 a i → i a_i\rightarrow i ai?i 連一條邊,連完之后就會出現多個環,只出現環的原因是:如果將每個位置看作一個點,每個點都只有一個入度和一個出度。而且環上每個位置上的數的正確位置都是它指向的下一個位置(廢話),也就是環上每個位置的數都只偏移了一位。

根據這個思路,可以把問題轉化為,多個置換環怎么把數歸位。假設環長為 a a a,發現如果環中兩種顏色都存在,那么它可以通過交換 a ? 1 a-1 a?1 次把所有數歸位。

歸位方法是:環上每一段連續的白色或黑色的最后一個標記一下,都先不動,然后從中隨便取一個開始向后給路上的每個點進行歸位,然后遇到下一個被標記的點,讓它接著向下交換,換一遍后剩下的就是黑白黑白顏色交替的顏色沒有歸位了,再隨便找一個,把它和在它的正確位置上的點交換位置(因為是黑白交替,它下一個位置的點一定和它顏色不同,所以一定是可以交換的),然后換出來的點以此類推和正確位置上的點交換,最后就能換好,因為每次交換都會有一個點被放入正確位置,而最后一次交換兩個點會同時歸位,所以一共需要 a ? 1 a-1 a?1 次交換。

如果是純色的環,就需要在別處借一個異色過來,然后再還回去,這就需要 a + 1 a+1 a+1 次交換。

但是如果有兩個不同純色的環,它們可以先交換其中一個點,兩邊都排好序后再換回來,這樣兩邊都只需要 a a a 次交換就可以了。

所以這個題我們需要統計每個環是同色還是異色,如果是異色就加 環長 ? 1 環長-1 環長?1,否則加 環長 + 1 環長+1 環長+1。再統計純黑和純白分別有幾個,最后再減去兩值小的*2就行了。啊嘞,好像不是黑色是紅色

code:

#include <iostream>
#include <cstdio>
#include <set>
#include <cstring>
#include <vector>
using namespace std;
const int maxn=1e5+5;int n,a[maxn];
string color;int main(){cin>>n;for(int i=1;i<=n;i++)cin>>a[i];cin>>color;color=" "+color;int ans=0,w=0,r=0;vector<bool> vis(n+5,false);for(int i=1;i<=n;i++){int cnt=0;bool f1=false,f2=false;//有紅 有白 if(!vis[i]){vis[i]=true;cnt++;if(color[i]=='W')f1=true;else f2=true;for(int p=a[i];p!=i;p=a[p]){vis[p]=true;cnt++;if(color[p]=='W')f1=true;else f2=true;}if(cnt==1)continue;else if(f1 && f2)ans+=cnt-1;else {ans+=cnt+1;if(f1)w++;else r++;}}}if(ans==0)cout<<0<<endl;else if(color.find("W")==string::npos || color.find("R")==string::npos)cout<<-1<<endl;else cout<<ans-min(w,r)*2<<endl;return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/712245.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712245.shtml
英文地址,請注明出處:http://en.pswp.cn/news/712245.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Opencv實戰(4)詳解輪廓

輪廓 Opencv實戰系列&#xff0c;前文&#xff1a; 文章目錄 輪廓(1).查找繪制1.findContours()2.drawContours() (2).層級結構(3).篩選輪廓(4).凸包 (1).查找繪制 預處理&#xff1a; 灰度化&#xff1a;使用cv::cvtColor()圖像去噪&#xff1a;使用高斯濾波cv::Gaussian(…

Acwing-基礎算法課筆記之數學知識(擴展歐幾里得算法)

Acwing-基礎算法課筆記之數學知識&#xff08;擴展歐幾里得算法&#xff09; 一、擴展歐幾里得算法1、裴蜀定理2、過程模擬3、代碼模板 二、線性同余方程1、定義2、模擬過程3、結論證明 一、擴展歐幾里得算法 1、裴蜀定理 對于任意正整數 a a a&#xff0c; b b b&#xff0…

day48 ● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

一遍過。 當前房屋偷與不偷取決于 前一個房屋和前兩個房屋是否被偷了。所以這里就更感覺到&#xff0c;當前狀態和前面狀態會有一種依賴關系&#xff0c;那么這種依賴關系都是動規的遞推公式。 class Solution { public:int rob(vector<int>& nums) {vector<vec…

門店縱深不足、入口有遮擋影響客流準確率?近景客流幫你搞定!

為了優化運營策略、提升門店營收&#xff0c;很多店鋪和商場都會安裝客流攝像機。但是在實際應用中&#xff0c;由于門店縱深受限等原因&#xff0c;導致無法使用之前的常規客流產品。 針對這種情況&#xff0c;悠絡客最新研發了近景客流產品&#xff0c;即使存在入口被遮擋或門…

內網信息搜集

目錄 內網基礎知識 基本流程圖 怎么判斷是否在域內 常規信息類收集-應用&服務&權限等 cs信息搜集 bloodhound安裝及使用 內網基礎知識 工作組&#xff1a;將不同的計算機按照功能分別列入不同的組&#xff0c;想要訪問某個部門的資源&#xff0c;只要在【網絡】里…

pyqt教程

一、組件安裝配置 1.安裝組件 在Anaconda Prompt下進入自己的python環境 pip install PyQt5 pip install PyQt5-tools 2.vscode安裝插件 3.配置路徑 配置Pyuic:Cmd與Qtdesigner:Path路徑 1.Pyuic:Cmd路徑 一般是在你安裝的python環境下的 \Scripts\pyuic5.exe 2.Qtdesigner:P…

anaconda簡介以及安裝(Windows)

介紹 Anaconda是一個開源的Python發行版本&#xff0c;它是一個打包的集合&#xff0c;里面預裝了conda、Python、眾多packages、科學計算工具等。Anaconda的目的是方便使用Python進行數據科學研究&#xff0c;它涵蓋了數據科學領域常見的Python庫&#xff0c;并且自帶了專門用…

Python的循環結構練習

歸納編程學習的感悟&#xff0c; 記錄奮斗路上的點滴&#xff0c; 希望能幫到一樣刻苦的你&#xff01; 如有不足歡迎指正&#xff01; 共同學習交流&#xff01; &#x1f30e;歡迎各位→點贊 &#x1f44d; 收藏? 留言?&#x1f4dd; 生命對某些人來說是美麗的&#xff0c…

我國每年研究生的畢業數量統計分享

本數據集詳細記錄了自1949年至2021年我國每年研究生的畢業數量&#xff08;包括碩士和博士學位的畢業生&#xff09;。在2021年&#xff0c;我國的研究生畢業生人數達到了772,761人&#xff0c;此數字比上一年度增加了44,000人。 統計的數據單位使用的是人數。 數據展示&…

mysql,for循環執行sql

遇到一個問題&#xff0c;我需要模擬上百萬數據來優化sql&#xff0c;線上數據down不下來&#xff0c;測試庫又沒有&#xff0c;寫代碼執行要么慢要么就是sql語句太長。 于是&#xff0c;直接用mysql自帶的功能去實現&#xff01; 簡單而簡單 mysql可以for循環&#xff1f;沒…

Laravel框架: Call to a member function connect() on null 異常報錯處理

Laravel框架&#xff1a; Call to a member function connect() on null 異常報錯處理 Date: 2024.03.01 21:03:11 author: lijianzhan 原文鏈接: https://learnku.com/laravel/t/63721 問題&#xff1a; local.ERROR: Call to a member function connect() on null {"…

【前端素材】推薦優質后臺管理系統 Greeva平臺模板(附源碼)

一、需求分析 1、系統定義 后臺管理系統是一種用于管理網站、應用程序或系統的管理界面&#xff0c;通常由管理員和工作人員使用。它提供了訪問和控制網站或應用程序后臺功能的工具和界面&#xff0c;使其能夠管理用戶、內容、數據和其他各種功能。 2、功能需求 后臺管理系…

使用mininet快速入門ONOS路由交換技術與原理-路由篇

上篇文章 《使用mininet快速入門ONOS路由交換技術與原理-交換篇》 使用mininet搭建了一個簡單的網絡拓撲&#xff0c;并實現了同一交換機下同網段多主機的通信&#xff0c;其中涉及到的通信知識主要以二層mac地址通信為主。 但在蕓蕓網絡的世界中&#xff0c;主機間的通信除了…

【C++】數組、函數、指針

文章目錄 1.數組1.1一維數組1.2二維數組 2.函數3.指針&#xff1a;可以通過指針間接訪問內存(指針記錄地址&#xff09;3.1 指針的定義和使用3.2 指針所占用空間3.3 空指針和野指針3.4 const修飾指針3.5指針和數組3.6指針和函數3.7練習&#xff08;指針、數組、函數&#xff09…

綜合練習(二)

目錄 列出薪金比 SMITH 或 ALLEN 多的所有員工的編號、姓名、部門名稱、領導姓名、部門人數&#xff0c;以及所在部門的平均工資、最高和最低工資 補充 spool Oracle從入門到總裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 列出薪金比 SMITH 或 AL…

STM32USART串口數據包

文章目錄 前言一、介紹部分數據包兩種包裝方式&#xff08;分割數據&#xff09;HEX數據包文本數據包 數據包的收發流程數據包的發送數據包的接收固定包長的hex數據包接收可變包長的文本數據包接收 二、實例部分固定包長的hex數據包接收連接線路代碼實現 可變包長的文本數據包接…

【InternLM 實戰營筆記】基于 InternLM 和 LangChain 搭建你的知識庫

準備環境 bash /root/share/install_conda_env_internlm_base.sh InternLM升級PIP # 升級pip python -m pip install --upgrade pippip install modelscope1.9.5 pip install transformers4.35.2 pip install streamlit1.24.0 pip install sentencepiece0.1.99 pip install a…

MySQL 多表查詢 連接查詢 外連接

介紹 MySQL 多表查詢 連接查詢 內連接 外連接分為兩種&#xff0c;左外和右外連接&#xff0c; 左外&#xff1a;相當于查詢表1(左表)的所有數據 包含 表1和表2交集部分的數據,完全包含左表的數據 右外&#xff1a;相當于查詢表2(右表)的所有數據 包含 表1和表2交集部分的數據…

比特幣暴漲逼近歷史最高點;阿里云全線降價20%丨 RTE 開發者日報 Vol.155

開發者朋友們大家好&#xff1a; 這里是 「RTE 開發者日報」 &#xff0c;每天和大家一起看新聞、聊八卦。我們的社區編輯團隊會整理分享 RTE &#xff08;Real Time Engagement&#xff09; 領域內「有話題的 新聞 」、「有態度的 觀點 」、「有意思的 數據 」、「有思考的 文…

mysql查詢某個庫下所有表的數據量

要查詢MySQL數據庫下指定數據庫的所有表的數據量&#xff08;即每個表中的記錄數&#xff09;&#xff0c;你可以使用以下步驟&#xff1a; 連接到MySQL數據庫&#xff1a;首先&#xff0c;你需要使用MySQL客戶端或任何支持MySQL連接的編程語言&#xff08;如Python, PHP, Nod…