buct12月月賽總結

2021-08-13 17:20:06 字數 4578 閱讀 8175

好久沒寫部落格了。。。。

這次是大學後第一次部落格,用來總結12月月賽。8道a了6道。ab等補充。

題目描述

有編號1-n的n個格仔,機械人從1號格仔順序向後走,一直走到n號格仔,並需要從n號格仔走出去。機械人有乙個初始能量,每個格仔對應乙個整數a[i],表示這個格仔的能量值。如果a[i] > 0,機械人走到這個格仔能夠獲取a[i]個能量,如果a[i] < 0,走到這個格仔需要消耗相應的能量,如果機械人的能量 < 0,就無法繼續前進了。問機械人最少需要有多少初始能量,才能完成整個旅程。

例如:n = 5。 最少需要2個初始能量,才能從1號走到5號格仔。途中的能量變化如下3 1 0 3 7。

1e9>=n>=1

-1e5<=a[i]<=1e5

輸入給定乙個n,接下來n行,每行乙個數字,第i行的數字是a[i],表示這個格仔能獲取的能量

輸出輸出結果為乙個數字,代表機械人最少需要有多少的初始能量

樣例輸入51

-2-134

樣例輸出

2

怎麼說呢?這是乙個大暴力。從最少的初始能量就是保證途中能量最小值為0。也就是說,初始能量就是途中能量最小值的相反數。因此,我們有了時間複雜度為n的演算法。唯一的坑就是,資料需要longlong存。

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;//不要在意這麼多頭檔案

int main()

printf("%lld",-min);

return

0;//不需要解釋了

}

題d:最後乙個是誰?題目描述

有n個人圍成一圈,順序排號。從第乙個人開始報數(第乙個報1,第二個報2……),凡報到m的人退出圈子(下乙個人從1開始報),問最後留下的是原來第幾號的那位。

輸入 多組測試資料 t;

第一行輸入t,1<=t<=10.

接下t行,每行兩個整數,n,m 1<=n<=1000,1<=m<=1000.

輸出 輸出t行,每行乙個整數。

樣例輸入

2 468 335

501 170

樣例輸出

88 393瑟夫問題,不解釋。

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;//說了不要在意標頭檔案

int main()

}

題目描述

將1,2,······,9共9個數排成下列形態的三角形。

ab c

d ef g h i

其中:a~i分別表示1,2,······,9中的乙個數字,並要求同時滿足下列條件:

(1)a

;(2)b3)a+b+d+f=f+g+h+i=i+e+c+a=p

輸入邊長之和p

輸出所有滿足上述條件的三角形的個數以及其中的一種方案。

若有多種方案輸出字典序最小的那種。若無解輸出no。

樣例輸入

21樣例輸出43

2496

7158

這是乙個很坑的問題:由於資料問題,現場沒有乙個ac的。賽後改了資料,全場乙個兩個ac的。另乙個學號還特別詭異。其實,還是乙個大暴力。乙個陣列標記每個數是否使用過了。或者最後判斷a+b+c+d+e+f+h+i==55&&a*b*c*d*e*f*g*h*i==1*2*3*4*5*6*7*8*9

或者選擇打表。

唯一的問題就是**很長。

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

int flag[10];

int run(int p)

flag[i]=0;

}flag[f]=0;

}flag[c]=0;

}flag[b]=0;

}flag[a]=0;

}if(find==0)

printf("%d\n",find);

for(int a=1;a<8;a++)//這段是輸出最小字典序

flag[g]=0;

}flag[i]=0;

}flag[f]=0;

}flag[c]=0;

}flag[b]=0;

}flag[a]=0;

}}int main()

題目描述

cc和tt在宿舍忙著寫課設,他們決定由下述遊戲的敗者去拿外賣:

室友a想乙個[1,n]中的數字x,兩人輪流猜乙個猜乙個數字,恰好猜中x的人算負;否則室友a將告訴兩人當前猜的數字是比x大還是比x小,這樣一來猜測的範圍就會變小(下一輪猜的數必須在x所在的那一半區間內)。初始範圍是[1,n]。

室友a已經看透了一切,私下告訴了兩人x是多少。現在,cc和tt都知道x是多少,且兩個人都採取最優策略。若總是cc先猜,求x∈[1,n]可以使tt獲勝的x的數量。

輸入第一行乙個整數t表示資料組數。

接下來t行,每行乙個正整數n。

1<= t <= 100000

1<= n

<= 10000000

輸出t行每行乙個整數表示答案。

樣例輸入13

樣例輸出

1

這是乙個博弈論的題目。

先說答案。如果是偶數那麼結果是0。如果是奇數,那麼結果是1。唯一的結果就是x在1和n最中間。

具體最佳解法就是對稱。當對稱時,無論tt從左邊取多少,cc就從右邊取多少。這樣取到最後,左右都沒有數,tt就必須選擇x,然後gg。

因此,對稱時必敗狀態。所以,所有能到必敗狀態的都是必勝狀態。即,不對稱是必勝的。然而——

cc先取數。cc可以一下子取到對稱。

因此,只有對稱是tt能獲勝的狀態。

時間複雜度1

#include

using

namespace

std;

int main()

}

題目描述

小明喜歡數字,現在小明想把乙個數字拆分成若干個奇數的乘積,但他不知道

能不能拆分成功,你能幫幫他麼

給你n個數,每個數都在int範圍內

01e5

單樣例輸入

nx1x2...xn

輸出n行,每行乙個輸出"yes"或"no"(不包括引號)

樣例輸入23

6樣例輸出

yesno

還是乙個判斷奇偶的題目。似乎不用解釋了。簽到題(雖然資料開始也是錯的。。。。)

不會的回去補數學去。

#include

int main()

}

題目描述

八年級的vova今天在課堂上值班。上課之後,他走進辦公室洗板子,並在上面找到了n號。他問這個數字是什麼,數學老師inna petrovna回答vova說,n是一年級學生算術任務的答案。在教科書中,給出了某個正整數 x。n為十進位制x加上各位上的數字的 和。

由於數字n很小,vova很快就猜到了在教科書中可能出現哪個x。現在他想得到乙個程式,它將搜尋任意值為n的所有合適的x值,或者確定這個x不存在。為vova寫乙個這樣的程式

輸入第一行包含整數n(1≤  n  ≤10^9)。

輸出在第一行列印乙個整數k 表示滿足要求的方案

後k行按照公升序列印滿足要求的數字

樣例輸入

2120

樣例輸出115

0提示15+1+5=21,只有乙個滿足要求

對於本蒟蒻而已,這個題似乎沒有規律。由於n的數字很小(嗯,10^9),所以特別暴力就會tle(time limit exist)。因此,不能從1開始篩。

讀題。乙個小於10^9的數字,加上每一位。一共不超過10位,每位小於10,因此x與n的差一定小於100。剩下的,就是100個數分別求其加每一位的值。很暴力吧?

為了省時間,使用了queue。

#include

#include

#include

#include

#include

#include

using

namespace

std;

int find(int n)

if(p==n)q.push(i);

}cout

while(!q.empty())

}int main()

}

大體就這樣了。除了一堆資料問題,這次月賽還是有許多特別水(暴力)的題目的。

程式設計俱樂部12月月賽總結

題目背景 今天是冬至日,是時候吃餃子了。今天中午,某學校大發善心說請所有同學在教學樓下集合,排成一橫隊,會免費發放餃子。當所有準備領取餃子的同學在樓下排好的時候,一位有強迫症的老師請所有的男同學站在所有女生的右邊。我們已知每秒鐘所有排在左邊的男生會與他相鄰的並且在右邊的女生交換位置。問多少秒鐘之後所...

2018 1月 月賽總結

a題 n,m 1e18,p 1e5,lucas定理求組合數 include include include using namespace std typedef long long ll ll n,m,p 100003 ll f 100005 ll qpow ll a,ll b return an...

安恆杯12月月賽

這次的月賽可以說非常適合我這種菜雞做了請求包中發現乙個user base64 解碼得到user,構造admin 然後base64提交 發現跳轉到後台admin.php 試了乙個ls發現有回顯,應該是個命令執行漏洞 構造 cmd ls ifs 成功回顯 然後讀取flag cmd cat ifs ffl...