暑假集訓test7

2021-08-03 21:19:15 字數 3712 閱讀 1620

所以我又回來了,這次是test7。

(test1,test2,test3,集體失蹤,敬請期待(攤手))

嗯,喜大普奔。

上題。題目描述

給出乙個由數字(『0』-『9』)構成的字串。我們說乙個子串行是好的,如果他的每一位都是 1、8、0、7 ,並且這四個數字按照這種順序出現,且每個數字都出現至少一次(111888888880000007 是好的,而 1087 不是)。請求出最大的好的子串行的長度。

輸入格式

輸入唯一一行乙個字串。

輸出格式

一行乙個整數表示答案。

樣例資料

輸入 1800777700088888000777

輸出 13

備註

【資料範圍】

對 30% 的輸入資料 :字串長度≤100 ;

對 100% 的輸入資料 :字串長度≤1000000 。

第一次看到題的時候糾結了好久,感覺怎麼做都考慮不完全。

最後決定把『1』賦為1,『8』賦為2,『0』賦為3,『7』賦為4。

然後用了最長不下降子串行。

但是bug簡直太多了。

首先不僅2大於1,3也大於1,4也是。

然後又不能保證1、2、3、4四個數字都會出現。

於是又在不同情況下做了分類討論,討論出來3kb。

然後……然後只有10分。

這是乙個黃少天聽了沉默,韓文清看了流淚的故事。

好了,**和正解。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

int len,ans;

int a[1000005],f[1000005][5];

char s[1000005];

int main()

cout

<0,f[len][4])0;}

開乙個二維陣列(其實一維也可以,為了敘述方便)f[i][j],i表示現在已經取了前面i位,用到了第j個數字(即1、8、0、7),最後輸出f[n][4]。

至於動態轉移方程,e.g.對於『8』來說,只有前面是『1』或是『8』時才有更新的資格,否則沒有。

題目描述

給出一幅由 n 個點 m 條邊構成的無向帶權圖。

其中有些點是黑點,另外點是白點。

現在每個白點都要與他距離最近的黑點通過最短路連線(如果有很多個,可以選取其中任意乙個),我們想要使得花費的代價最小。請問這個最小代價是多少?

注意:最後選出的邊保證每個白點到黑點的距離任然是最短距離。

輸入格式

第一行兩個整數 n,m ;

第二行 n 個整數,0 表示白點,1 表示黑點;

接下來 m 行,每行三個整數 x,y,z ,表示一條連線 x 和 y 點,權值為 z 的邊。

輸出格式

如果無解,輸出「impossible」,否則,輸出最小代價。

樣例資料

輸入 5 7

0 1 0 1 0

1 2 11

1 3 1

1 5 17

2 3 1

3 5 18

4 5 3

2 4 5

輸出 5

備註

【樣例說明】

選 2、4、6 三條邊。

【資料範圍】

對 30% 的輸入資料 :1≤n≤10,1≤m≤20;

對 100% 的輸入資料 :1≤n≤100000,1≤m≤200000,1≤z≤1000000000 。

嗯很好,其實第一遍看的時候根本沒有理解題目的意思。

好吧最後還是懂了,就是找乙個白點到周圍黑點的最短路,若有多個全部相加。(然而懂了也並沒有什麼用)【滑稽】

直接說說考完後拿到的正解吧。

整個解題過程分為兩塊,但前提是還要證明兩條規律。

1.最短路上的所有點必連通,且一條最短路上只有最末點是黑點,其餘皆為白點。

2.每個點連在最短路上都只連一次,即乙個白點到黑點的最短路只有一條。

所以整個問題就分為先用各種演算法(喜歡就好)求最短路,然後再建最小生成樹,注意能連通的盡量都要連通。

具體做法可以取乙個超級點s,在s與每個黑點之間連權值為0的邊(可以理解為把所有的黑點都變成起點),先處理從s出發到每個點的最短距離,獲得最短路徑圖一張。這樣以後我們需要取權值最小的邊的集合使這幅圖連通,此時用到kruskal演算法求最小生成樹。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define s 0

using

namespace

std;

struct node

bian[3000003];

struct gl

e[3000003];

int n,m,tot,cnt,inf,cont;

long

long ans,dis[100010];

int first[100010],b[3000003],c[100010];

bool exist[100010];

inline

void create(int x,int y,int z)

inline

void czh(int x,int y,int z)

inline

void zql(int s)}}

}}inline

int find(int x)

inline

bool comp(gl a,gl b)

for(int i=1;i<=m;i++)

zql(s);

for(int i=1;i<=n;i++)

if(dis[i]==inf)

for(int i=1;i<=n;i++)

for(int j=first[i];j;j=bian[j].next)

sort(e+1,e+1+cnt,comp);

for(int i=1;i<=n;i++)

c[i]=i;

for(int i=1;i<=cnt;i++)

} if(ans)

cout

cout

<<"impossible"

0;

}

好吧其實是真有的,但是莫比烏斯函式什麼的數論那一坨還沒有過多涉獵,基本上看著題解也是一臉大寫的懵逼,所以就裝作什麼都不知道的樣子,假裝只有兩道題,嗯咳。。。。。

來自2017.7.17

——我認為return 0,是乙個時代的終結。

暑假集訓test6

喜聞樂見,test續集。來上題。題目描述 alice 和 bob 有乙個長度為2n的數。現在他們要在這個數字上玩遊戲。他們分別要從 2n 個位中取出 n 個位組成自己的幸運值。每一回合,alice 或 bob 把數字最左邊的那一位拿來放在自己幸運值的最末位。在第 i 輪操作過後,被選取的數字 原數的...

暑假集訓test14

我會告訴你test13被我吃了嗎?當然不會。哦其實還多吃了一道題。fst是一名可憐的 oier,他很強,但是經常 fst,所以 rating 一直低迷。但是重點在於,他真的很強!他發明了一種奇特的加密方式,這種加密方式只有oier 才能破解。這種加密方式是這樣的 對於乙個 01 串,他會構造另乙個 ...

暑假集訓test 8 28

大概是從我一年以來做過的最 的一套題了。乙個半小時打完三個程式三個暴力拍完以為自己ak了,開心地耍了兩個小時。結果t3要寫高精,ll炸了後4個點,中間還有個點是啥都不選的,我沒用0去更新又炸了乙個點,成功把自己炸成乙個二百五。1.最小生成樹模板題,前天那道題的 弱化 大概期望你去寫個prim但是kr...