2020.10.16個人賽
阿新 • • 發佈:2020-10-21
題目:Power Sequence
思路:
這題猛一看看到資料會很大,但是可以想到,當你選的c很大時,肯定不是你最後的答案,所以可以去大膽的遍歷c,當在維護最小值時,若出現大於當前最小值時,後面c再增大肯定會更大,不會有你想要的結果,所以就跳出迴圈,輸出當前維護的最小值即可。
解題程式碼:
#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <string> #include <cstring> #include<map> #include <set> #include <vector> using namespace std; const long long N = 1e18 + 7; const int maxn = 1e5 + 4; const long long INF = 8e18; typedef long long ll; #define for0(i,n) for(int i = 0;i < n;i++) #define for1(i,n) for(int i = 1;i <= n;i++) ll num[100100]; int main(){int n; cin >> n; for0(i,n) cin >> num[i]; sort(num,num+n); ll minnum = N; for1(c,10000000){ ll sum = 0; ll sign = 1,temp = 1; for0(i,n){ sum += abs(num[i] - temp); temp *= c; if(sum > minnum){ sign= 0; break; } } if(sign == 0) break; minnum = min(minnum,sum); } cout << minnum << endl; return 0; }
題目:Basketball Exercise
思路:
給出兩行隊伍,每個數代表一個人的身高,你的挑選規則是從左到右,而且你在某一行選完一個人後,就要去另外一個隊伍裡選擇,求出挑選完隊員的最大總身高,這個我們可以想到狀態轉換,假設正在處理第一行第4個人的選擇問題,那麼它要麼是從第一行第2個人或者第二行第3個人轉換來的,也可能不選擇第一行第4個人,繼承第一行第3個人的狀態,所以可以根據分析寫出dp。
解題程式碼:
#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <string> #include <cstring> #include <map> #include <set> #include <vector> using namespace std; const long long N = 1e18 + 7; const int maxn = 1e5 + 4; const long long INF = 8e18; typedef long long ll; #define for0(i,n) for(int i = 0;i < n;i++) #define for1(i,n) for(int i = 1;i <= n;i++) #define for2(i,n) for(int i = 2;i <= n+1;i++) ll dp[100010][2]; ll num1[100010],num2[100010]; int main(){ int n; cin >> n; for2(i,n) cin >> num1[i]; for2(i,n) cin >> num2[i]; for(int i = 2;i <= n+1;i++){ dp[i][0] = max(dp[i-1][1],dp[i-2][0]) + num1[i]; dp[i][0] = max(dp[i-1][0],dp[i][0]); dp[i][1] = max(dp[i-1][0],dp[i-2][1]) + num2[i]; dp[i][1] = max(dp[i-1][1],dp[i][1]); } cout << max(dp[n+1][1],dp[n+1][0]) << endl; return 0; }