9.7 顺丰笔试 AC代码
第一题,求递归次数,动态规划,dp[i] = dp[i-1] + dp[i-2] + dp[i-3] +1,初始状态dp[1],dp[2],dp[3]都为1,注意越界,每次对1e9+7取余。
第二题,构造试卷,贪心算法,将数组排序,取最大的m个用来作为构成试卷,其他的题用来给不够的题“替补”,让构成试卷的m个数的最小值尽可能的大,最终的结果就是m个数的最小值。
#include<bits/stdc++.h> using namespace std; int main() { int n, m; cin>>n>>m; vector<int> nums(n); for(int i = 0; i < n; ++i) { cin>>nums[i]; } sort(nums.begin(), nums.end()); long long cur = 0; for(int i = 0; i < (n-m); ++i) { cur += nums[i]; } int start = n-m; int j; for(j = start; j < n-1; ++j) { if( (long long)(nums[j+1] - nums[j])*(j - start + 1) <= cur) { cur -= (long long)(nums[j+1] - nums[j])*(j - start + 1); } else { break; } } if(j < n-1) { cout<<nums[j] + (cur)/(j-start+1) <<endl; } else { cout<<nums[j] + (cur)/m <<endl; } return 0; }