1. 程式人生 > >切蛋糕

切蛋糕

microsoft span 覆蓋 sof clu 會有 問題 什麽 obi

問題描述

一塊邊長是2L的正方形蛋糕落在坐標軸內,中心在原點上,現在你豎直切了m次,水平切了n次,中間還挖出了一個長度是2P的正方形的洞,洞的中心也在原點上。求最終蛋糕分成了幾塊。

技術分享圖片

輸入格式

輸入cake.in共四行。

第一行一個數L,第二行一個數P

第三行n個數,表示水平切的位置

第四行m個數,表示豎直切的位置

輸出格式

一個數,表示最終那個蛋糕的個數

樣例輸入

5

3

1 -4

1

樣例輸出

6

數據範圍

30% 的數據 L,P≤10,1≤n,m≤2

100%的數據 1≤L,P,1≤n,m≤100

題解

假設中間沒有挖掉一個正方形的洞,那麽,最終會有(n+1)*(m+1)個蛋糕。

而事實上中間挖掉一個正方形的洞,這對答案會有什麽影響呢?

如圖,

技術分享圖片

有幾個小蛋糕完全被正方形的洞覆蓋了,這些蛋糕不能算入答案的總個數。

假設水平切有px次經過挖掉的洞,豎直切有py次經過挖掉的洞,顯然,完全被正方形覆蓋的校蛋糕有(px-1)*(py-1)個;

最終答案就是(n+1)*(m+1)減去完全被洞覆蓋的蛋糕數。

 1 #include <string>
 2 #include <cstdio>
 3 int L,P,ans,x[105],y[105],xt,yt,px,py;
 4 bool visx[200],visy[200],vis;
5 int main() 6 { 7 int res,i,j,f; 8 char ch; 9 bool fg,mak; 10 scanf("%d%d\n",&L,&P); 11 for (ch=getchar();ch!=\n;ch=getchar()) 12 { 13 res=0; f=1; 14 while ((ch<0 || ch>9) && ch!=- && ch!=\n) ch=getchar();
15 if (ch==\n) break; 16 if (ch==-) f=-1,ch=getchar(); 17 while (ch>=0 && ch<=9) 18 res=res*10+ch-0,ch=getchar(); 19 res*=f; 20 if (!visx[res+100]) visx[res+100]=1,x[++xt]=res; 21 if (ch==\n) break; 22 } 23 for (ch=getchar();ch!=\n;ch=getchar()) 24 { 25 res=0; f=1; 26 while ((ch<0 || ch>9) && ch!=- && ch!=\n) ch=getchar(); 27 if (ch==\n) break; 28 if (ch==-) f=-1,ch=getchar(); 29 while (ch>=0 && ch<=9) 30 res=res*10+ch-0,ch=getchar(); 31 res*=f; 32 if (!visy[res+100]) visy[res+100]=1,y[++yt]=res; 33 if (ch==\n) break; 34 } 35 for (i=1;i<=xt;i++) 36 if (-P<=x[i] && x[i]<=P) 37 px++; 38 for (i=1;i<=yt;i++) 39 if (-P<=y[i] && y[i]<=P) 40 py++; 41 if (px<1) px=1; 42 if (py<1) py=1; 43 printf("%d",(xt+1)*(yt+1)-(px-1)*(py-1)); 44 return 0; 45 }

切蛋糕