1. 程式人生 > >第七屆藍橋杯Java/A組 第五題

第七屆藍橋杯Java/A組 第五題

題目:

廣場舞

LQ市的市民廣場是一個多邊形,廣場上鋪滿了大理石的地板磚。

地板磚鋪得方方正正,就像座標軸紙一樣。
以某四塊磚相接的點為原點,地板磚的兩條邊為兩個正方向,一塊磚的邊長為橫縱座標的單位長度,則所有橫縱座標都為整數的點都是四塊磚的交點(如果在廣場內)。

廣場的磚單調無趣,卻給跳廣場舞的市民們提供了絕佳的參照物。每天傍晚,都會有大批市民前來跳舞。
舞者每次都會選一塊完整的磚來跳舞,兩個人不會選擇同一塊磚,如果一塊磚在廣場邊上導致缺角或者邊不完整,則沒人會選這塊磚。
(廣場形狀的例子參考【圖1.png】)

現在,告訴你廣場的形狀,請幫LQ市的市長計算一下,同一時刻最多有多少市民可以在廣場跳舞。

【輸入格式】
輸入的第一行包含一個整數n,表示廣場是n邊形的(因此有n個頂點)。
接下來n行,每行兩個整數,依次表示n邊形每個頂點的座標(也就是說廣場邊緣拐彎的地方都在磚的頂角上。資料保證廣場是一個簡單多邊形。

【輸出格式】
輸出一個整數,表示最多有多少市民可以在廣場跳舞。

【樣例輸入】
5
3 3
6 4
4 1
1 -1
0 4

【樣例輸出】
7

【樣例說明】
廣場如圖1.png所示,一共有7塊完整的地板磚,因此最多能有7位市民一起跳舞。

【資料規模與約定】
對於30%的資料,n不超過100,橫縱座標的絕對值均不超過100。
對於50%的資料,n不超過1000,橫縱座標的絕對值均不超過1000。
對於100%的資料,n不超過1000,橫縱座標的絕對值均不超過100000000(一億)。


資源約定:
峰值記憶體消耗 < 256M
CPU消耗  < 1000ms

請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。

所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效程式碼處理。


思路:

 1.找到圖形整體所在的X區間

2.將影象的頂點存在一個set集合中,由於不懂如何在set中存二元座標,所以定義了內部類point 含有兩個屬性x,y 。

3. 由頂點座標依次遍歷每一條邊,找到每一條線段,在X區間的每一個x值對應的y值, 並將其存在map 中

4. 然後通過y值上下的減法,得到每個x值有效的座標點的數量

5.通過座標點的數量求小矩形的面積: 兩個相鄰的x值組成的座標塊數量= min(兩個有效座標的的數量)-1;

6.加和得出result

程式碼如下:

package come_on;
import java.util.*;
public class Fifth {
    static int 
x_start; static int x_end; static class point{ float x; float y; public point(float x, float y){ this.x=x; this.y=y; } } public static void main(String args[]){ ArrayList<point> list = new ArrayList<>(); Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); scanner.nextLine(); for(int i=0;i<n;i++){ point points = new point(scanner.nextInt(),scanner.nextInt()); scanner.nextLine(); list.add(points); } Set<point> set = new HashSet<>(); x_start = (int)list.get(0).x; x_end= (int)list.get(0).x; for(int i=0;i<5;i++){ float x1 = list.get(i).x; float y1 = list.get(i).y; float x2,y2; if(x_start>=(int)x1) x_start= (int)x1; if(x_end<=(int)x1) x_end= (int)x1; if(i!=list.size()-1){ x2 = list.get(i+1).x; y2 = list.get(i+1).y; } else { x2 = list.get(0).x; y2 = list.get(0).y; } for(float x0=Math.min(x1,x2);x0<Math.max(x1,x2);x0++){ float y0 =(y1-y2)/(x1-x2)*(x0-x1)+y1; point point_x = new point(x0,y0); set.add(point_x); } } Map<Integer,Integer> map = new TreeMap<>(); map.put(x_start,0); map.put(x_end,0); for(point p:set){ float x0 = p.x; float y0 =p.y; for(point p0:set){ float x00 =p0.x; float y00 =p0.y; if(x00==x0&&y0>y00){ map.put((int)x0,(int)((int)y0-y00)+1); } } } int result =0; for(int i =x_start;i<x_end-1;i++){ if(map.get(i)!=null&&map.get(i+1)!=null){ int q = Math.min(map.get(i),map.get(i+1))-1; if(q>=0) result+=q; } } System.out.println(result); } }

這道題沒有檢視答案,做了大概有四個小時,感覺自己的不足還很多,繼續加油。

同樣還有個問題沒有搞懂(百度也沒有查到),希望大神指點一二:

set集合用迭代器輸出自定義物件point的時候,打印出來的是地址,但是用for迴圈輸出的時候就沒有這個問題,不知道是為什麼。

以及還有什麼更好的想法或者思路歡迎交流討論。

相關推薦

藍橋Java/A

題目:廣場舞 LQ市的市民廣場是一個多邊形,廣場上鋪滿了大理石的地板磚。 地板磚鋪得方方正正,就像座標軸紙一樣。 以某四塊磚相接的點為原點,地板磚的兩條邊為兩個正方向,一塊磚的邊長為橫縱座標的單位長度,則所有橫縱座標都為整數的點都是四塊磚的交點(如果在廣場內)。 廣場的

藍橋JAVA B省賽-四平方和試題

四平方和 四平方和定理,又稱為拉格朗日定理: 每個正整數都可以表示為至多4個正整數的平方和。 如果把0包括進去,就正好可以表示為4個數的平方和。 比如: 5 = 0^2 + 0^2 + 1^2 + 2^2 7 = 1^2 + 1^2 + 1^2 +

藍橋-藍橋java B決賽

一、憤怒小鳥 X星球憤怒的小鳥喜歡撞火車!  一根平直的鐵軌上兩火車間相距 1000 米 兩火車 (不妨稱A和B) 以時速 10米/秒 相對行駛。 憤怒的小鳥從A車出發,時速50米/秒,撞向B車, 然後返回去撞A車,再返回去撞B車,如此往復.... 兩火車在相距1米處停車。

藍橋Java C決賽試題

1.平方末尾能夠表示為某個整數的平方的數字稱為“平方數”比如,25,64雖然無法立即說出某個數是平方數,但經常可以斷定某個數不是平方數。因為平方數的末位只可能是:[0, 1, 4, 5, 6, 9] 這6個數字中的某個。所以,4325435332必然不是平方數。如果給你一個2

藍橋Java A決賽試題

1.標題:圖書排列將編號為1~10的10本書排放在書架上,要求編號相鄰的書不能放在相鄰的位置。請計算一共有多少種不同的排列方案。注意,需要提交的是一個整數,不要填寫任何多餘的內容。答案:479306思路:全排或者DFSimport java.util.*; public cl

藍橋Java B決賽試題

1.憤怒小鳥X星球憤怒的小鳥喜歡撞火車!一根平直的鐵軌上兩火車間相距 1000 米兩火車 (不妨稱A和B) 以時速 10米/秒 相對行駛。憤怒的小鳥從A車出發,時速50米/秒,撞向B車,然後返回去撞A車,再返回去撞B車,如此往復....兩火車在相距1米處停車。問:這期間憤怒的

藍橋java B試題之分小組小

9名運動員參加比賽,需要分3組進行預賽。 有哪些分組的方案呢? 我們標記運動員為 A,B,C,… I 下面的程式列出了所有的分組方法。 該程式的正常輸出為: ABC DEF GHI ABC DEG FHI ABC DEH FGI ABC DEI

藍橋java b

watermark alt args 暴力破解 out col HR sdn oid 第三題 三羊獻瑞 觀察下面的加法算式: 其中,相同的漢字代表相同的數字,不同的漢字代表不同的數字。 請你填寫“三羊獻瑞”所代表的4位數字(答案唯一),不要填寫任何多余內容。 答案這個題目

藍橋java b8

CP stat exti 要求 得到 嚴格 else scan 內容 樂羊羊飲料廠正在舉辦一次促銷優惠活動。樂羊羊C型飲料,憑3個瓶蓋可以再換一瓶C型飲料,並且可以一直循環下去,但不允許賒賬。 請你計算一下,如果小明不浪費瓶蓋,盡量地參加活動,那麽,對於他初始買入的n瓶飲料

2015 藍橋 Java C 8 矩陣排列

矩陣排列輸入w m n ,w為寬度如寬度為6 1    2     3      4    5     6 12 11  10     9    8     7 13 14  15  16   17   18 24 23  22   21  20   19.........

2016藍橋C++B:四平方和

題目: 四平方和 四平方和定理,又稱為拉格朗日定理: 每個正整數都可以表示為至多4個正整數的平方和。 如果把0包括進去,就正好可以表示為4個數的平方和。 比如: 5 = 0^2 + 0^2

算法筆記_212:藍橋軟件類決賽真Java語言B

技術 emp 字符串表 求解 如果 過去 系統 多少 ann 目錄 1 憤怒小鳥 2 反幻方 3 打靶 4 路徑之謎 5 堿基 6 圓圈舞 前言:以下代碼僅供參考,若有錯誤歡迎指正哦~ 1 憤怒小鳥 憤怒小鳥 X星球憤怒的小鳥喜歡撞火車! 一根平直的鐵

藍橋Java語言B(省賽)

今天參加藍橋JAVA語言B組的競賽剛剛結束,把真題和大家分享一下。 1.煤球數目  (結果填空) 有一堆煤球,堆成三角稜錐形。具體: 第一層放1個, 第二層3個(排列成三角形), 第三層6個(排列成三角形), 第四層10個(排列成三角形), .... 如果一共有100

藍橋大學生Cjava決賽題目 密文搜尋

標題:密文搜尋福爾摩斯從X星收到一份資料,全部是小寫字母組成。他的助手提供了另一份資料:許多長度為8的密碼列表。福爾摩斯發現,這些密碼是被打亂後隱藏在先前那份資料中的。請你編寫一個程式,從第一份資料中搜

藍橋java b第一

都是 text nbsp post ppa hbm 藍橋杯 文字 fill 第一題 三角形面積 圖中的所有小方格面積都是1。 那麽,圖中的三角形面積應該是多少呢? 請填寫三角形的面積。不要填寫任何多余內容或說明性文字。 填空答案 28 沒什麽好說的 第一題很水 估計

藍橋 Java 煤球數目問題

煤球數目 有一堆煤球,堆成三角稜錐形。具體: 第一層放1個, 第二層3個(排列成三角形), 第三層6個(排列成三角形), 第四層10個(排列成三角形), … 如果一共有100層,共有多少個煤球? 請填表示煤球總數目的數字。 注意:你提交的應該是一個整數,不要填寫

藍橋JAVA B【省賽】

一.標題: 購物單小明剛剛找到工作,老闆人很好,只是老闆夫人很愛購物。老闆忙的時候經常讓小明幫忙到商場代為購物。小明很厭煩,但又不好推辭。這不,XX大促銷又來了!老闆夫人開出了長長的購物單,都是有打折優惠的。小明也有個怪癖,不到萬不得已,從不刷卡,直接現金搞定。現在小明很心煩

藍橋 java B 日期問題

標題:日期問題 小明正在整理一批歷史文獻。這些歷史文獻中出現了很多日期。小明知道這些日期都在1960年1月1日至2059年12月31日。令小明頭疼的是,這些日期採用的格式非常不統一,有采用年/月/日的,有采用月/日/年的, 還有采用日/月/年的。更加麻煩的是,年份也都

2015藍橋C++B:牌型種數

題目: 牌型種數 小明被劫持到X賭城,被迫與其他3人玩牌。 一副撲克牌(去掉大小王牌,共52張),均勻發給4個人,每個人13張。 這時,小明腦子裡突然冒出一個問題: 如果不考慮花色,只考慮點數,也不考慮自己得到的牌的先後順序,自己手裡能拿到的初始牌型組合

藍橋C++B 四平方和

四平方和四平方和定理,又稱為拉格朗日定理:每個正整數都可以表示為至多4個正整數的平方和。如果把0包括進去,就正好可以表示為4個數的平方和。比如:5 = 0^2 + 0^2 + 1^2 + 2^27 = 1^2 + 1^2 + 1^2 + 2^2(^符號表示乘方的意思)對於一個