滁州學院1024程式設計競賽題解

2021-10-25 03:24:58 字數 3629 閱讀 8370

受到語法的限制(就連陣列都不能涉及太多),絕大部分的常用演算法都無法考察,此次比賽更多的是對邏輯思維能力的鍛鍊。

簽到題,直接模2即可。

#include

intmain()

else

return0;

}

簡單的數字分離。多次迴圈,通過模10再除10分離出各個位置上的數字並求和,最後判斷該數字模上它的數字和是否是0即可。

#include

intmain()

//判斷n是否可以被s整除

if(n % s)

else

return0;

}

博弈論入門題,通過簡單的證明可以得知,當初始的石子數量為奇數時,alpha必勝,當初始的石子數量為偶數時,小軒必勝。證明過程如下:如果初始的石子數量為奇數,則不管小軒如何去分,都會產生乙個奇數個數的石堆和乙個偶數個數的石堆,此時alpha可以扔掉奇數個數的石堆,將偶數個數的石堆分成兩個奇數個數的石堆,這樣不管小軒扔掉哪乙個石堆,小軒的必然還剩下乙個奇數的石堆,小軒繼續(且必須)將奇數的石堆分成乙個奇數的石堆和乙個偶數的石堆,alpha繼續上一次的步驟。這樣持續下去,到小軒分割石堆的時候,石堆必然有奇數個石子,因為石子是越分越少,最後小軒手上必然出現石堆中只有乙個石子的情況,此時小軒無法分割,即alpha必勝。當初始的石子數量為偶數時,也可以使用相同的方法證明,這裡不再贅述。

#include

intmain()

else

}return0;

}

模擬+特判

#include

intmain()

else

if(m <=1)

else

printf

("%d\n"

, sum);}

}return0;

}

入門級線性dp(數字三角形模型),因為每次只能向上或者向左,所以我們定義乙個狀態為 dp[i][j] 表示能夠到達 (i, j) 這個點的所有方案的能量最大值。所以動態轉移方程為:dp[i][j] = arr[i][j] + max(dp[i+1][j], dp[i][j+1])。

#include

int arr[

1010][

1010];

int dp[

1010][

1010];

intmain()

}//動態規劃

for(

int i = n; i >=

1; i--

)else}}

//輸出結果

printf

("%d\n"

, dp[1]

[1])

;return0;

}

簽到題,因為只需要對三個數進行排序,所以只需手動模擬交換排序的核心過程即可。

#include

intmain()

//如果a大於c 則a和c交換位置

if(a > c)

//如果b大於c 則b和c交換位置

if(b > c)

//輸出結果

printf

("%d %d %d\n"

, a, b, c)

;return0;

}

此題為防ak題,難度較大,看不懂的同學可以直接跳過,不做要求。考察的是多重揹包問題的二進位制優化(後台資料較大,多重揹包的樸素解法會被卡掉)。

#include

long

long w[

2010

], cnt;

bool f[

100010];

long

long a[

2010

], s[

2010];

int t, n, k;

intmain()

for(

int i =

1; i <= n;

++i)

scanf

("%d"

,&k)

;//二進位制優化 分解成01揹包問題

for(

int i =

1; i <= n;

++i)

if(s[i]

>0)

} n = cnt -1;

for(

int i =

0; i <=

100010

;++i)

//動態規劃

f[0]

= true;

for(

int i =

1; i <= n;

++i)}if

(f[k])}

//輸出結果

if(f[k]

)else

}return0;

}

迴圈計算出階乘,然後數字分離再統計即可。階乘的結果可能會炸int,必須用long long來存,考慮到大部分同學並沒有學習到陣列,這裡展示不用陣列的寫法,用陣列的話,**會精簡很多。

#include

//用於儲存0~9 各個數字出現的次數

int n0, n1, n2, n3, n4, n5, n6, n7, n8, n9;

intmain()

//數字分離

while

(ans)

else

if(ans %

10==1)

else

if(ans %

10==2)

else

if(ans %

10==3)

else

if(ans %

10==4)

else

if(ans %

10==5)

else

if(ans %

10==6)

else

if(ans %

10==7)

else

if(ans %

10==8)

else

if(ans %

10==9)

ans /=10

;}//輸出結果

printf

("%d %d %d %d %d %d %d %d %d %d\n"

, n0, n1, n2, n3, n4, n5, n6, n7, n8, n9)

;return0;

}

迴圈讀入,維護最大值即可。

#include

using namespace std;

int n, t;

intmain()

}//輸出結果

printf

("%d\n"

, idx)

;printf

("%d\n"

, ans)

;return0;

}

2023年湘潭大學程式設計競賽 題解

湘潭大學的校賽對acm新手的考察還是很全面很合理的,題目不難,多掌握些知識就可以都做出來。點這兒。給你乙個開始時間和結束時間,讓你算一下這中間經過了多少秒。這題是個簽到題,模擬下減法就行了,注意 的簡潔寫法。include using namespace std int main return 0 ...

競賽題解 NOIP2018 旅行

坑還得一層一層的填 填到day2t1了洛谷 p5022 以下copy自洛谷,有刪減 修改 小 y 是乙個愛好旅行的 oier。她來到 x 國,打算將各個城市都玩一遍。小y了解到,x國的 n 個城市之間有 m 條雙向道路。每條雙向道路連線兩個城市。不存在兩條連線同一對城市的道路,也不存在一條連線乙個城...

競賽題解 NOIP2018 賽道修建

額 考試的時候大概猜到正解,但是時間不夠了,不敢寫,就寫了騙分qwq 現在把坑填好了 copy from 洛谷 c 城將要舉辦一系列的賽車比賽。在比賽前,需要在城內修建 m 條賽道。c 城一共有 n 個路口,這些路口編號為 1,2,n 有 n 1 條適合於修建賽道的雙向通行的道路,每條道路連線著兩個...