20181103 考試記錄

2022-05-08 19:42:09 字數 3701 閱讀 2944

題目

這是$noip$模擬賽(---)

t1:想的太複雜了,開頭$1$個小時認為此題不可做,所以到最後也懶得打$o(n)$的方法,只打了$o(n^2)$的東西

我的做法:

先把資料的圖建出來,然後檢視對於每個列是否沒產生矛盾

#include#include

#include

#include

#include

#include

using

namespace

std;

inline

intread()

while(c>='

0'&&c<='9')

return f*ans;

}int vis[300001],n,has[300001],a[300001],b[300001],c[300001],lb[300001],lc[300001

];struct

nodex[

1010001

];int ma[300001

];int cnt,head[300001

];void add(int u,int

v)int ba[300001],ca[300001

],ans;

int bb[101],cc[101],minn=2

<<30-1,aa[101],book[101

];void dfs(int

pos)

}}void

check()

}sort(aa+1,aa+aa[0]+1

); sort(bb+1,bb+bb[0]+1

); sort(cc+1,cc+cc[0]+1

);

for(int i=1;i<=aa[0];i++)

return

; }

minn=min(minn,n-ans);

return;}

void dfs1(int

pos)

book[pos]=1

; dfs1(pos+1

); book[pos]=0

; dfs1(pos+1

); book[pos]=0;}

intmain()

for(int i=1;i<=n;i++) add(i,i+n),add(i,i+2*n);

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

cout

<

return0;

}/*91 3 5 9 8 6 2 4 7

2 1 5 6 4 9 3 4 7

3 5 1 9 8 6 2 8 7

*/

view code

別人的做法:

垃圾搜尋。其實要抓住第一列是不重複的數這一特點去解題。若第$2,3$列有沒有出現而在第$1$行出現的時候,則這一列必須刪去,有可能又有不存在的數,就再去刪除,時間複雜度$o(n)$,因為每個列只會最多刪去一次。並且可以去先按照第一行排序,這樣就方便查詢了。

正確性:因為有小於$0$的就必有$\leq 2$的數,而這就恰好可以去進行搜尋了,但是如果去先統計$\leq 2$的點,就會產生衝突,因為不知道該刪哪個

t2:好像以前講過類似的題,但是卻不會寫,自己的暴力也還掛了,看到$n \leq 9$想到什麼,搜尋  狀壓啊,但在考場上還不會寫。

我們設$dp(i,s)$表示已經要決策到第i條邊,點的集合劃分為$s$($n!$狀壓),每個點都能在當前的集合中互相到達的概率是多少。

所以分兩種情況討論:

若第i條邊是好的,則$dp(i,合併當前的2個集合)=dp(i-1,s)*(1-)$

若是不好的,則$dp(i,s)=dp(i-1,s)*(p_i)$

主要是怎麼去寫那個$s$

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define rep(i,x,y) for(register int i=(x);i<=(y);i++)

#define dwn(i,x,y) for(register int i=(x);i>=(y);i--)

#define maxn 10

#define maxm 90

#define maxs 363000

using

namespace

std;

intread()

void write(int

x)

if(x<0)x=-x,putchar('-'

);

while(x)ch[++f]=x%10+'

0',x/=10

;

while(f)putchar(ch[f--]);

putchar('\n

');}int

mul[maxn],tmp[maxn],tmp2[maxn],eu[maxm],ev[maxm],n,m;

long

double ew[maxm],p[2

][maxs];

int gx(int x,int y)

void bac(ints)}

intgets()

returns;}

/*int maxs;

void getst(int x)

if(yes[s])

rep(i,

1,n)tmp2[i]=i;

int nows=gets();

p[0][nows]=1.0

;

//cout

,m)

if(ss>tt)swap(ss,tt);

rep(j,

1,n)

int nxt=gets();

//cout<

//rep(j,1,n)cout/

cout

p[now][u]+=p[pre][u]*ew[i];

//cout

}double ans=p[m&1][0

]; printf(

"%.3lf

",ans);

return0;

}

syft3:斜率優化$dp$,但是沒有學,所以留坑待補

$score:60+40+40=140$這分數是要完的節奏啊

接下來的是cxm講課的幾道題

t1:平面上有$n \leq 3 \times 10^5$的店,座標$\leq 10^5$,點上有能量,且只能往直右或直上走,每走一次需要有$k$的能量($k \leq 10^3$),問最大能量

我們只要將怎樣去快速轉移達到就行了,所以我們採取從下到上,從左往右的順序去$dp$,每一行內的答案可以去記錄,每一列的答案可以用個表去更新,記錄

t2:有$n$個與$m$個單詞$(\leq 3\times 10^5)$,每個單詞$30$個字元,問每個單詞的暴力查詢次數($you$ $guess$ 這是什麼意思)

建一棵$trie$樹,若$m$中的乙個單詞$p$在$n$中沒有出現過,那麼答案就很好統計,否則,我們可以都掃瞄過一遍,然後看一看是$n$中第幾個單詞,然後在建一棵$trie$樹,維護一下歷史版本的答案,每次統計完答案在加入字串,最後一塊輸出即可

2017 3 18考試記錄

雖然只做出了乙個題,但是第二題跟第三題也有思路,就是單位時間解題效率不高導致沒有做完,所以以後要多做題來加強一下。第一題 題目要求看能否讓所有排隊的人都能正好買到票拿到找零 分析 運用新學的stl中的map容器,將面值與數量存入容器中 注 當收到100要找零75時,應該注意找零順序,有50就給50和...

2019 7 30考試記錄

機房模考 2019.7.30 今天考了三道題,算是題量較小,所以在考場上時間挺充裕,寫下了一段簡單的記錄。在引用的基礎上增加一些考試後講題的感悟吧。這道題乍一看是個斯特林數,但是慢慢審題,會發現它和斯特林數的區別 座位不能連續放女生 男生預設填充 那就有點像兔子生殖的那題,也就是在乙隻兔子生下後不能...

2019 8 3考試記錄

題目不難,還剩乙個小時,寫下記錄 寫於考場 現在看來好樂觀233 題目確實不難,但是打的有多差233 難受 字串模擬。不看下面的描述,我還以為是道裸kmp。但是更貼心的是,模式串可以分開 笑哭 應該就是反著掃一遍 字典序要大 模式串匹配了就存一下陣列下標。如果存下來的下標個數等於模式串長度那就是匹配...