小試4解析

2021-08-07 19:02:49 字數 2295 閱讀 5166

題目質量不錯。

t1:應該能看出是乙個裸(so easy)的貪心+排序吧?

這裡我們考慮乙個dp,設dp[i][j]表示前i位,使用了j次變換,能獲得的最小距離。

那麼dp[i][j]=min(dp[i-1][j]+abs(n[i]-m[i]),dp[i-1][j-1]+(n[i]==m[i])),還是很好推的。

不過由於資料範圍太太太太小了,所以n^4什麼的dp都可以水過去。

#include#include#include#includeusing namespace std;

const int k=61;

char n[k],m[k];

int k;

int f[k][k];

int main()

printf("%d",f[l][k]);

return 0;

}

t2:乙個找方形聯通塊的問題。至於判bad placement的,我們可以先找到乙個#,然後把這個#向四個方向延伸,

然後在延伸得到的範圍矩形中看看是否有'.',有則肯定是bad,沒有則再將邊界上的#向矩形外擴散乙個單位距離,看看是否還有#,有則肯定也是bad,如果沒有bad,拿個計數器累和一下就行了。

#include#include#includeusing namespace std;

const int n=1010;

const int dx[4]=;

const int dy[4]=;

char a[n][n];

bool vis[n][n];

int n,m,ans=0;

void print()

void bfs(int sx,int sy)

int tx,ty;

for (tx=sx+1;tx<=n;tx++)if (a[tx][sy]=='.')break;else if (vis[tx][sy])print();tx--;

for (ty=sy+1;ty<=m;ty++)if (a[sx][ty]=='.')break;else if (vis[sx][ty])print();ty--;

for (int i=sx;i<=tx;i++)

for (int j=sy;j<=ty;j++)

}int main()

t3:很巧妙的dp,當我們用普通的線性方程dp[i]很好的無法表示方案數時,我們考慮加入乙個維度來表示一些不完美狀態(即不是答案要求的狀態),然後通過這些不完美狀態來進行更方便的相互之間的轉移,和向完美狀態的轉移。這個思想是非常實用的。

對於此題,由於乙個l字型的磚塊,一定會是第一行與第二行產生(或消除)乙個單位磚塊的差距。那麼我們就設dp[i][0]表示第一行與第二行恰好平齊。

dp[i][1]表示第一行比第二行多乙個單位磚塊。

dp[i][2]表示第二行比第一行多乙個單位磚塊。

那麼轉移方程就很好(真的很好寫)寫了(列舉所有的情況就行了)。可以自己思考一下。

#include#include#includeusing namespace std;

const int mod=10000;

const int n=1000100;

int n;

int f[n][3];

int main()

printf("%d",f[n][0]);

}

t4:乙個數學問題。首先我們可以很容易看出,只有2^p個瓶子才能變成乙個瓶子。所以我們考慮將n拆分成不超過k個數字,使得每個數字到第乙個比它大的2的次冪的差的和最小(很繞口)。既然有2的次冪,我們就把n在2進製下考慮。

例如(10000)2=10011100010000

我們考慮乙個貪心策略:直接把n的二進位制的前k-1個1拆分依次出來,那麼這一部分對答案就是沒有貢獻的了。然後直接把第k個1減去第k+1~....個1的和。可以試試,答案就是15808。

我們再想想這個貪心策略為什麼是對的?

首先,如果第1個1我們不直接取走的話,我們一定會對答案產生至少第1個1../2的貢獻,這個貢獻是致命的。因為不論你後面怎麼取,這個答案都會大於第1個1../2,所以我們必須把第1個1直接取走,後面同理。然後把第k+1個1直接補齊到第k個1就行了。

這麼講似乎很模糊,建議自己動手算一算。

#include#include#includeusing namespace std;

int n,k,tot=0;

int a[50];

int main()

小試3解析

確實需要思考。1.傳球 細加分析即可知結果為c 3,n include includeusing namespace std int n int main 2.矩形交換 顯然直接模擬是不可取的。我們可以令a i i,表示第i行是原先的第a i 行 那麼在交換行的時候,我們只需交換對應的a的值即可。i...

OpenCL 4 小試牛刀

前四章已經講了那麼多的概念,下面該真刀真槍地試一試了。下面是宿主機端程式 123 4567 891011 1213 1415 1617 1819 2021 2223 2425 2627 2829 3031 3233 3435 3637 3839 4041 4243 4445 4647 4849 50...

4 反向解析

回到頂部 隨著功能的增加會出現更多的檢視,可能之前配置的正規表示式不夠準確,於是就要修改正規表示式,但是正規表示式一旦修改了,之前所有對應的超連結都要修改,真是一件麻煩的事情,而且可能還會漏掉一些超連結忘記修改,有辦法讓鏈結根據正規表示式動態生成嗎?就是用反向解析的辦法。回到頂部 回到頂部 回到頂部...