慶生賽題解

2021-08-18 02:40:02 字數 3236 閱讀 3124

一、面積問題

題目簡述:有乙個矩形,全部由0和

*組成。現在大佬和卓坤有乙個問題想問你:求由

*所完全包圍的圖形的面積,面積的計算方法是統計

*包圍的四邊形中的

0的數目。現要你求這個矩陣中的最大面積是多少?

題目分析:這道題其實正解並不是很難,主要是讀入的方法。這道題並沒有告訴你矩陣的長和寬。所以對於這種題目,我們有一種讀入方法:while (scanf()!=eof)或者

whlie (~scanf())

這兩種方法來讀入這些資料。

那麼本題的主要思路為:將矩陣看成乙個被*半包圍的矩陣,在慢慢深入,最後矩陣裡面的

0全是面積。即開始時將第一行的

*和第一列的

*看成圍牆(當然可能並不是全部都是),將第一列圍牆中所含的

0的所有相連的稱號全部標記為

false

,再將第一行的

0以及它所有相連的稱號看為

false

,這個思路其實和

dfs中的細胞染色的思路相像。最後矩陣中所有標記為正確的個數即為面積的大小。

那麼具體**如下:

#include

using namespace std;

char ch[220],ch1[220][220];

int n=0,len=0;

bool f[220][220]={};

int dx[5]=;

int dy[5]=;//方向陣列

void dfs(int x,int y)

}int main()//先處理好

while (~scanf("%s",&ch))

}//讀入結束

for (int i=1;i<=n;i++)//行處理

if (ch1[i][1]=='0')//如果當前的數為

0,說明沒被包圍

dfs(i,1);//將它相鄰的

0給清掉

for (int j=1;j<=len;j++)

if (ch1[1][j]=='0')

dfs(1,j);//同樣的,處理列

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

for (int j=1;j<=len;j++)

if (ch1[i][j]=='0') ans++;//如果是

0,說明被包圍,累加個數

cout《輸出

return 0;

}總結:這道題的考點主要是輸入和dfs,其他的處理不算難

二、營救行動

問題簡述:公主被魔王抓到了乙個n行

m列的矩陣中,矩陣中有守衛。這是她心愛的其實來營救她了!假設其實每走一步需要

1點體力,殺死乙個守衛還需要

1點體力,問騎士拯救公主所需的體力最少為多少?其中

#為圍牆,不能移動;

.為空地;

x為守衛;

a為公主;

r為騎士。

題目分析:一道赤裸裸的搜尋題,dfs、

bfs隨便選,不在多說。

**如下:

#include

using namespace std;

int dx[5]=;

int dy[5]=;

int n,m,xx,yy,a,b,sum[220][220];

bool f[220][220]={},f1[220][220]={};

struct nodeq[100001]={};

int main()

int tail=0;

q[++tail].x=a;q[tail].y=b;

sum[a][b]=0;

for (int head=1;head<=tail;head++)}}

if (sum[xx][yy]>10000000) printf("no answer\n");

else printf("%d",sum[xx][yy]);

return 0;

}那麼小夥伴們,你們這是注意到什麼了嗎??沒錯,一坨黃黃的東西——t!l!e!

誒呀竟然超時了

~,那麼我們這時就要想到記憶化!它可以拯救我們。

那麼記憶化**如下:

#include

using namespace std;

int n,m,x1,x2,x3,x4;

bool f1[201][201]={},fff=0;

int f[201][201]={},ff[201][201]={};

int dx[5]=;

int dy[5]=;

void dfs(int x,int y,int s)

}int main()

memset(f,30,sizeof(f));

dfs(x1,x2,0);

if (f[0][0]==f[x3][x4])

printf("no answer\n");

else cout}總結:這道題是一題經典的搜尋題,只要有搜尋的底子也是不難的

三、大佬的福星

題目簡述:大佬和他的福星共有n個人,每個人都有乙個幸運號碼

a_i.

如果第i個人的號碼能被第

j個人的號碼整除,那麼第j人

是第i個人的福星(自己不算)。現在大佬的老師劉、嶽兩

佬想要算出每個人都有多少個福星?

題目分析:我做這道題前第一種引入眼簾的方法就是——暴力!很顯然,暴力確實很簡單,但穩穩的n^2

可能就不會這麼簡單了——不超時才怪呢!所以,我們在這裡可以用線性篩素數的方法——將每個同學的號碼先提前用線性篩素數預處理一遍,最後只要用

o(1)

的時間就能得出結果了!

那麼具體**如下:

#include

int main(),a[100001]={},maxx=0,n,f[1000001]={};

scanf("%d",&n);

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

for (int i=1;i<=maxx;i++)//從

1到查詢範圍進行搜尋

if (b[i]>0)//如果當前數出現的話

for (int j=1;j<=maxx/i;j++)//進行線性篩素數

f[i*j]+=b[i];//將他的倍數累加上當前數

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

printf("%d\n",f[a[i]]-1);//輸出

return 0;

}總結:這道題考的主要是對倍數和因數之間關係的理解,如果能想到線性篩素數,這道題也就成功一半了。

氣死「人」的慶生賽

人 比 人 氣死 人 為什麼 人 要加引號呢?因為這是我們班的乙個梗,看不透很正常 寫之前向老師道個歉,上週作業沒寫完,所以沒寫部落格,萬望老師饒我一命 來看看我的成績 1 很明顯,題目描述被我改過了 hzk 沒錯,這次我就要黑hzk 樣例 input 00 0 0 00 0 output 2 中間...

女生賽題解

a b有一定難度 注意以後在左移右移的時候是否要轉換型別,轉換成long long 特別是b題有很好的思路,大數無法計算那就轉化成log進行計算,特別是對精度要求不高的時候。題解 a 思維題 求 之和。統計每個數有多少個0,然後這些0上填1和0都會 後變為0,在n有1的地方如果i為1那麼答案就是1 ...

10 26離線賽題解

這次的離線賽不是內部的題,可以放出來了。a題 這題作為聯賽第一題是偏難的,這題其實是有聯賽第二題難度 反倒是b題水的一b。我們可以清晰的知道,本題需要求解的是 s um i nu m i 的最大值 由於資料範圍的緣故,直接暴力肯定不行 這不是廢話 我首先看到這題想到的是貪心 對於每行i都選取該值最大...