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