1. 程式人生 > 實用技巧 >2020.10.16個人賽

2020.10.16個人賽

題目: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;
}