2017計蒜之道初賽第四場AB兩題題解

A題:商湯科技致力於引領人工智能核心“深度學習”技術突破,構建人工智能、大數據分析行業解決方案。作爲一家人工智能公司,用機器自動地解決各類實際問題自然不在話下。近日,商湯科技推出了一套安全令牌,令牌如下圖所示:

安全令牌上的小孔有 nnnmmm 列,不過有些行和有些列已經用導線整體焊接了,共有 kkk 根導線。

我們可以在安全令牌上 不重疊 地焊接若干個小芯片,每個芯片需要在相鄰(不能斜着相鄰,必須平行於行或列)的兩個沒有被焊接的小孔上固定。不能固定在已經被整體焊接的行或列上。

安全令牌上最多可以放置多少個芯片,就代表了這個安全令牌對應的校驗碼。當然,由於安全令牌上小孔的密度會很大,是很難目測出對應的校驗碼的。你作爲商湯科技的實習生,需要寫出一個程序,能夠自動地算出一個給定的安全令牌的校驗碼。

輸入格式

輸入第一行三個整數 n,m(1≤n,m≤100)n,m(1 \le n,m \le 100)n,m(1n,m100)k(0≤k≤n+m)k(0 \le k \le n + m)k(0kn+m)

接下來輸入 kkk 行,每行輸入兩個整數 d(0≤d≤1)d(0 \le d \le 1)d(0d1)ccc。如果 d=0d = 0d=0,表示第 c(1≤c≤n)c(1 \le c \le n)c(1cn) 行被整體焊接了,如果 d=1d = 1d=1,表示第 c(1≤c≤m)c(1 \le c \le m)c(1cm) 列被整體焊接了。

輸出格式

輸出安全令牌對應的校驗碼。

樣例輸入

4 5 2
0 3
1 4

樣例輸出

5



解題思路:安全令牌分割成爲若干個獨立的矩形區域。一個矩形區域如果長和寬都是奇數,那麼就會多出一個小孔,否則每個小孔都能用上。

#include
#define MAXSIZE 100
int map[MAXSIZE+1][MAXSIZE+1],n,m;
int dfs(int i,int j){
	if(i<=0||i>n||j<=0||j>m){
		return 0;
	}
	if(map[i][j]==1){
		return 0;
	}
	else{
		map[i][j]=1;
		return 1+dfs(i+1,j)+dfs(i,j+1);
	}
}
int main()
{
	int k,i,j,count=0,d,c;
	scanf("%d %d %d",&n,&m,&k);
	for(i=1;i<=n;i++){
		for(j=1;j<=m;j++){
			map[i][j]=0;
		}
	}
	for(i=0;i


B題:

商湯科技近日推出的 SenseVideo 能夠對視頻監控中的對象進行識別與分析,包括行人檢測等。在行人檢測問題中,最重要的就是對行人移動的檢測。由於往往是在視頻監控數據中檢測行人,我們將圖像上的行人抽象爲二維平面上若干個的點。那麼,行人的移動就相當於二維平面上的變換。

在這道題中,我們將行人的移動過程抽象爲 平移,有兩個 移動參數dxd_xdxdyd_ydy。每次行人的移動過程會將行人對應的所有點全部平移,對於平移前的點 (x,y)(x, y)(x,y),平移後的座標爲 (x+dx,y+dy)(x + d_x, y + d_y)(x+dx,y+dy)

我們現在已知一個行人對應着 nnn 個點,座標分別爲 (x1,y1),(x2,y2)…(xn,yn)(x_1,y_1),(x_2,y_2)\ldots (x_n,y_n)(x1,y1),(x2,y2)(xn,yn),平移後的座標分別爲 (x1′,y1′),(x2′,y2′)…(xn′,yn′)(x_1',y_1'),(x_2',y_2')\ldots (x_n',y_n')(x1,y1),(x2,y2)(xn,yn)

很顯然,通過平移前後的正確座標,很容易算出行人的移動參數,但問題沒有這麼簡單。由於行人實際的移動並不會完全按照我們預想的方式進行,因此,會有一部分平移後的座標結果不正確,但可以確保 結果不正確的座標數量嚴格不超過一半

你現在作爲商湯科技的實習生,接手了這個有趣的挑戰:算出行人的移動參數。如果不存在一組合法的移動參數,則隨意輸出一組參數;如果有多種合法的移動參數,輸出其中任意一組合法的即可。

輸入格式

第一行輸入一個整數 n(1≤n≤105)n(1 \le n \le 10^5)n(1n105),表示行人抽象出的點數。

接下來 nnn 行,每行 444整數。前兩個數表示平移前的座標,後兩個數表示平移後的座標。

座標範圍在 −109-10^910910910^9109 之間。

輸出格式

一行兩個整數,dxd_xdxdyd_ydy,表示行人的移動參數。

樣例輸入

5
0 0 1 1
0 1 1 2
1 0 2 1
1 1 0 0
2 1 1 0

樣例輸出

1 1
解題思路:

本題給定 nnn 對變換前後的二維點,要求在有一定容錯(錯誤的點對數嚴格不超過一半)的情況下,對變換進行復原。其關鍵條件在於對容錯率的限制:錯誤的點對數嚴格不超過一半。由於只有平移,我們可以首先計算出每對點對應的平移量。由於錯誤的點對數嚴格不超過一半,我們可以直接統計 nnn 組平移量中的衆數,即可得到答案。

本題還可以通過限制內存,要求大家在常數內存下完成。只需要一個計數器和一個與計數器對應的平移量即可。每次讀入一個點對,計算新的平移量。

(1)若此時計數器爲 000,則存下這個平移量,計數器修改爲 111

(2)若此時計數器不爲 000,則檢查是否與存着的平移量相同:如果相同,則計數器加一;否則減一。最終倖存下來的平移量即爲答案。

#include
typedef struct{
	int x;
	int y;
	int num;
}node;
node str[100001];
int count=0;
int main()
{
	int n,i,j,a,b;
	int x1,x2,x3,x4,flag;
	scanf("%d",&n);
	for(i=0;i=n){
			printf("%d %d",str[i].x,str[i].y);
			break;
		}
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章