一、面積問題
題目簡述:有乙個矩形,全部由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都選取該值最大...