湖南省第九屆大學生計算機程式設計大賽題解

2021-10-04 19:53:33 字數 3437 閱讀 1753

題目描述

我想當乙個好老師,所以我決定記住所有學生的名字。可是不久以後我就放棄了,因為學生太多了,根本記不住。但是我不能讓我的學生發現這一點,否則會很沒面子。所以每次要叫學生的名字時,我會引用離他最近的,我認得的學生。比如有10個學生:

a ? ? d ? ? ? h ? ?

想叫每個學生時,具體的叫法是:

輸入

輸入只有一組資料。第一行是學生數n(1<=n<=100)。第二行是每個學生的名字,按照從左到右的順序給出,以逗號分隔。每個名字要麼是不超過3個英文本母,要麼是問號。至少有乙個學生的名字不是問號。下一行是詢問的個數q(1<=q<=100)。每組資料報含乙個整數p(1<=p<=n),即要叫的學生所在的位置(左數第乙個是位置1)。

輸出

對於每個詢問,輸出叫法。注意"middle of x and y"只有當被叫者離有兩個最近的已知學生x和y,並且x在y的左邊。

樣例輸入

10a ? ? d ? ? ? h ? ?43

8610樣例輸出

left of d

hmiddle of d and h

right of right of h

思路

這是乙個模擬題,只需要按照題目意思模擬一遍即可,但是要注意陣列越界以及選左選右的情況判定,當我們詢問的時候,如果這個學生恰好是認識的,那就直接輸出他的名字,如果不記得這個學生的名字那麼我們就要分三步去討論,我們就從詢問的學生開始左邊遍歷一次,直到遇到記得的學生的名字為止,如果在遍歷之後依然沒有記得的學生的名字那麼就把乙個無窮大的值賦給那個變數,這方便後面的比較,說明老師記得學生的名字可能在右邊。往右遍歷同理。最後一種情況就是左右記得的學生姓名距離相等那麼就按照題目的意思輸出即可

#include

using

namespace std;

const

int maxn =

0x3f3f3f3f

;char a[

110][4

];intmain()

}while

(a[left][0

]=='?')}if

(ll == rr)

printf

("middle of %s and %s\n"

, a[left]

, a[right]);

if(ll > rr)

if(ll < rr)}}

}return0;

}

題目描述有個腦筋急轉彎是這樣的:有距離很近的一高一低兩座橋,兩次洪水之後高橋被淹了兩次,低橋卻只被淹了一次,為什麼?答案是:因為低橋太低了,第一次洪水退去之後水位依然在低橋之上,所以不算「淹了兩次」。舉例說明:

假定高橋和低橋的高度分別是5和2,初始水位為1

第一次洪水:水位提高到6(兩個橋都被淹),退到2(高橋不再被淹,但低橋仍然被淹)

第二次洪水:水位提高到8(高橋又被淹了),退到3。

沒錯,文字遊戲。關鍵在於「又」的含義。如果某次洪水退去之後一座橋仍然被淹,那麼下次洪水來臨水位提高時不能算「又」淹一次。

輸入n座橋的高度以及第i次洪水的漲水水位ai和退水水位bi,統計有多少座橋至少被淹了k次。初始水位為1,且每次洪水的漲水水位一定大於上次洪水的退水水位。

輸入

輸入檔案最多包含25組測試資料。每組資料第一行為三個整數n, m, k(1<=n,m,k<=105)。第二行為n個整數hi(2<=hi<=108),即各個橋的高度。以下m行每行包含兩個整數ai和bi(1<=bibi-1)。輸入檔案不超過5mb。

輸出

對於每組資料,輸出至少被淹k次的橋的個數。

樣例輸入

2 2 2

2 56 2

8 35 3 2

2 3 4 5 6

5 34 2

5 2樣例輸出

case 1: 1

case 2: 3

ps:這個題目竟然用二分去做!!!

在此之前我用的暴力乙個乙個去判斷,很顯然會超時!所以我wa了6發,可憐之人必有可恨之處,蒟蒻的我還不太熟悉二分,在得知**時候,竟然連**有看了乙個多小時才看懂,這個題目有字首和的思想。所以我決定做一篇深刻的題解,歡迎各位acmer指出不足。

首先,我們把橋的高度先按照從小到大(從大到小也行)排序,這樣方便後面統計,這時候我們用二分去搜尋橋的高度,我們把每次被水淹沒的第乙個橋加一,把第乙個不被淹沒的橋進行減一操作,相當於左區間加一右區間減一,這樣就很方便我們用字首和求解問題,我手動舉個例子,比如sum[i] 陣列1 1 1 -1 -2這分別對應第1 2 3 4 5座橋,第一座橋被淹沒了一次,第二座橋加上前面那次就被淹沒了兩次…以此類推就可以求出第幾座橋被淹沒了幾次,那麼就是1, 2,3, 2,0不得不說這是乙個好方法,這也是乙個好題目。在**裡面我們可以用stl的自帶的二分函式

lower_boundupper_bound/函式

stl 自帶的二分函式—— upper_bound 和 lower_bound。

這兩個函式的作用是二分查詢乙個數在陣列**現的位置。區別是 upper 返回第乙個大於搜尋數的位置,而 lower 是第乙個大於等於的數的位置。顯然這道題用的是 lower。

函式的用法:lower_bound(a.begin(),a.end(),x) 返回第乙個大於等於 x 的數的位址。而由於是位址,在最後要 −a(也就是減去位址)。

lower_bound( )和upper_bound( )都是利用二分查詢的方法在乙個排好序的陣列中進行查詢的。

在從小到大的排序陣列中,

#include

using

namespace std;

const

int maxn =

1e5+10;

int h[maxn]

, sum[maxn]

;int

main()

int ans =

0, cur =0;

// for (int i = 0; i < n; ++i)

// cout << sum[i] << endl;

for(

int i =

0; i < n;

++i)

//字首和思想

printf

("case %d: %d\n"

,++ca, ans);}

return0;

}

時間能檢驗一

湖南省第九屆大學生計算機程式設計競賽 高橋和低橋

有個腦筋急轉彎是這樣的 有距離很近的一高一低兩座橋,兩次洪水之後高橋被淹了兩次,低橋卻只被淹了一次,為什麼?答案是 因為低橋太低了,第一次洪水退去之後水位依然在低橋之上,所以不算 淹了兩次 舉例說明 假定高橋和低橋的高度分別是5和2,初始水位為1 第一次洪水 水位提高到6 兩個橋都被淹 退到2 高橋...

第九屆湖南省大學生程式設計競賽部分題解

前言 這套題目到處都找不到,csu上面也提交不了。最後在湖南師大oj找到了,可是這個師大oj實在是不好用,每次提交都要重新登入不說,還不支援lld,還我浪費好多時間去改wa。思路 資料量比較小,直接暴力求解即可。include include include include include incl...

湖南省第六屆大學生計算機程式設計競賽 弟弟的作業

題目傳送門 本題雖然是水題,不過很好地訓練了輸入輸出的格式,使用scanf函式進行輸入的時候,我們可以連續使用 d c d s來讀取形如 12 34 423 這樣的式子,最後的結果使用 s是因為可能出現 使用atoi函式就可以將字串轉換為整數。include include include defi...