受到語法的限制(就連陣列都不能涉及太多),絕大部分的常用演算法都無法考察,此次比賽更多的是對邏輯思維能力的鍛鍊。簽到題,直接模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 條適合於修建賽道的雙向通行的道路,每條道路連線著兩個...