牛客寒假演算法基礎集訓營1

2021-09-30 17:28:20 字數 4764 閱讀 7260

菜雞乙個,只做出兩道,先掛一下,剩下的會了繼續更

1、小a的計算器

題目描述 :

小a的數學基礎實在太差了,以至於他只會用計算器算數。他的計算器比較特殊,只有

,+ ,-, *,/ (即加減乘除)四種運算。

經過一番周折,小a終於算出了他想要的數,但是他卻忘記了最初的數是什麼。不過幸運的是他記下了整個操作序列,他想請你幫他算出最初的數

輸入描述:

第一行兩個整數n, x,分別表示操作次數和最終的數接下來n行表示操作序列,每行兩個數opt, x

若opt= 1則表示將當前數加x

若opt= 2,則表示將當前數減x

若opt= 3,則表示將當前數乘x

若opt=4,則表示將當前數除以x

輸出描述:

乙個整數表示最初的數

示例1輸入

4 61 3

2 13 3

4 2輸出

2示例2

輸入3 292

3 24 3

4 3輸出

1314

備註:n⩽100,0資料保證:

最初的數在進行操作時不會超過long long範圍

如果你的程式合法,那麼運算中所有的數均為整數,所有的除法均為整除!

不會出現整數被0除的情況

只需要用一下stl裡面的stack就可以了,簽到題,沒什麼難度

#include#includeusing namespace std;

struct p;

stack s;

int main()

while(!s.empty()) }

cout<2、小a與204

題目描述

小a非常喜歡204這個數字,因為′a′+′k′=204現在他有乙個長度為n的序列,其中只含有2,0,4這三種數字設ai為序列中第i個數,你需要重新排列這個數列,使得∑(ai−ai−1)^2最大(公式的含義是:每個數與前乙個數差的平方的和)

注意:我們預設a0=0

輸入描述:

第一行乙個整數n接下來一行n個整數,第i個數表示ai

輸出描述:

輸出乙個整數,表示∑(ai−ai−1)^2的最大值

示例1輸入

22 4

輸出20

示例2輸入

32 0 4

輸出36

示例3輸入

52 4 0 2 4

輸出52

備註:1⩽n⩽105

保證ai為2/0/4中的數

用了乙個比較笨的辦法,先排序,再根據一小一大交替,這樣能保證和最大,猜測有簡便方法,因為只有2、0、4這三個數這個條件沒用上,可能是根據這三個數的個數有簡便方法

#include#includeusing namespace std;

int num[100005];

int main()

cout<3、小a的轟炸遊戲

題目描述

小a正在玩一款即時戰略遊戲,現在他要用航空母艦對敵方陣地進行轟炸

地方陣地可以看做是n×m的矩形航空母艦總共會派出q架飛機。

飛機有兩種,第一種飛機會轟炸以(xi,yi)為中心,對角線長為li的正菱形(也就是兩條對角線分別於x軸 y軸平行的正方形),而第二種飛機只會轟炸正菱形的上半部分(包括第xi行)

(具體看樣例解釋)

現在小a想知道所有格仔被轟炸次數的異或和

注意:不保證被轟炸的格仔一定在矩形範圍內,若越界請忽略

輸入描述:

第一行三個整數n,m,q,分別表示矩陣的長/寬/詢問次數

接下來q行,每行四個整數opt,x,y,l,表示飛機型別,轟炸的座標,以及對角線長度

保證l為奇數!

輸出描述:

乙個整數,表示所有格仔被轟炸次數的異或和

示例1輸入:

4 5 4

1 2 2 1

1 3 3 5

1 3 2 3

2 2 4 3

輸出:2

參***用的是二維差分,原諒我技術不夠從來沒聽說過這種方法,用的笨辦法,超時,過了一半,5000+人乙個ac的都沒有,果然難,實在想不出還有什麼可以繼續優化的地方了,先掛乙個過了一半超時的**

#include#includeint map[1010][1010];

int n,m;

int main()

} else

}int ans=0;

for(int i=0;i難點在於怎麼確定被轟炸的範圍,給的是轟炸的中心座標和轟炸半徑,也就是說要根據這個來確定乙個菱形,最簡單的情況是轟炸的菱形完全在地圖內,這種情況下就通過座標和半徑來確定就可以,每一行差2個點,這樣就可以確定,更複雜一點的情況是轟炸區域比地圖還要大,這樣就需要進行縮小,從轟炸中心的一行往上不斷縮小就可以了,菱形的下半部分是對稱的,**不需要有太大改動,用笨辦法做只能做到這樣,暫時還想不出來**還可以優化了,答案的二維差分如下,反正我是看不懂了

#include#define ll long long

using namespace std;

const int maxn = 1e6 + 10, max = 5001, inf = 1e9 + 10, base = 1201;

void chmin(int &a, int b)

void chmax(int &a, int b)

int sqr(int x)

inline int read()

while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();

return x * f;

}int n, m, q, type[maxn], a[max][max], opt[max][max][2], b[max][max], xx[maxn], yy[maxn], ll[maxn];

void solve1(int x, int y, int len)

void solve2(int x, int y, int len)

void print()

signed main()

}memcpy(b, a, sizeof(a));

memset(a, 0, sizeof(a));

memset(opt, 0, sizeof(opt));

for(int i = 1; i <= q; i++)

if(type[i] == 1) solve2(xx[i], yy[i], ll[i]);

for(int i = n + base * 2; i >= 0; i--)

}//print();

int ans = 0;

for(int i = 1 + base; i <= n + base; i++)

for(int j = 1 + base; j <= m + base; j++)

ans ^= (a[i][j] + b[i][j]);

cout << ans;

return 0;

}

4、小a的排列

題目描述

小a有乙個長度為n的排列。定義一段區間是"萌"的,當且僅當把區間中各個數排序後相鄰元素的差為1現在他想知道包含數x,y的長度最小的"萌"區間的左右端點

也就是說,我們需要找到長度最小的區間[l,r],滿足區間[l,r]是"萌"的,且同時包含數x和數y如果有多個合法的區間,輸出左端點最靠左的方案。

輸入描述:

第一行三個整數n,x,y,分別表示序列長度,詢問的兩個數

第二行有n個整數表示序列內的元素,保證輸入為乙個排列

輸出描述:

輸出兩個整數,表示長度最小"萌"區間的左右端點

輸入5 2 3

5 2 1 3 4

輸出2 4

輸入8 3 5

6 7 1 8 5 2 4 3

輸出5 8

備註:保證2⩽n⩽105,1⩽x,y⩽n

考點在於模擬和分析,意思就是說找乙個連續序列包含給出的兩個數,很像藍橋杯2023年本科b裡面的一道題,但是這一道更難,大體思路就是先找到給你的l和r,之後擴充套件空間,直到符合連續空間為止,這裡補充一點,一般的連續空間問題都要用到公式:max-min=r-l,即區間最大值-區間最小值等於右端點-左端點。具體看官方的**,自己寫的能過25%的資料,因為沒有考慮到擴充套件區間的更優方法。

#includeusing namespace std;

const int maxn = 1e5 + 10, inf = 1e9 + 10;

void chmin(int &a, int b)

void chmax(int &a, int b)

int n, l, r, a[maxn], pos[maxn];

int main()

cout << l << ' ' << r;

return 0;

}

強烈吐槽官方給的測試用例,情況太少,這裡補充一組測試用例

輸入:9 7 4

1 3 6 9 7 5 8 4 2

以這組測試用例為例,需要的l為7,r為4,交換一下後為l=4,r=7,就是說目前區間為這四個數,要想成為連續空間,需要補乙個6,在對應的pos陣列中查詢4-7的位置,從而求出要想使其 變成連續空間,就要把原區間擴充套件到l=6,r=7,這時候從l到r擴充套件為,由於擴充套件了一部分,要重新找區間最大值和區間最小值,再從對應pos陣列裡找位置,發現這時不需要再擴充套件空間,此時就說明現在的l-r為要求的萌區間,輸出l和r的位置即可。

主要的難點在於怎麼擴充套件區間,連續區間的特點要求要找最小和最大,再找最小和最大對應的位置,在這個新區間中再找最大最小,直到不需要再擴充套件區間。

牛客寒假演算法基礎集訓營1

題意 給出乙個n m的矩陣,找出有如下條件的三角形的個數 1.三角形的三個頂點均為格點,即橫座標和縱座標均為整數。2.三角形的面積為1 3.三角形至少有一條邊和x軸或y軸平行。思路 滿足條件的三角形有兩類 1 底為1,高為2 2 底為2,高為1。使底邊分別平行於x軸和y軸,其中會有重複的,計算中減去...

牛客寒假演算法基礎集訓營

首先看到這個題目資料範圍就可以知道這不是乙個可以暴力過的題。所以應該要推乙個結論。我們可以將這個同學的一來一回看成一組,那麼就可以理解為乙個來回中n可以減少n m 1 個人。那麼我們現在要讓所有人都進去,那就是看n m 1 的數量。但是有可能存在一些情況,就是說當你的倒數第二組中的回來的那趟使得n變...

2020牛客寒假演算法基礎集訓營1

找規律,推公式 三角形個數為2 m n m n m 1 n 1 2 m n mn m 1 n 1 2 m n mn m 1 n 1 include include include include using namespace std typedef long long ll const int m...