所以我又回來了,這次是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...