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;
}

 

posted @ 2020-10-21 15:40  emhhbw==  阅读(104)  评论(0)    收藏  举报