牛客编程巅峰赛S2赛季第一场初级场题解与参考代码
第一题 最小差值:
考察基本语法,简单二重循环模拟即可
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 求最小差值 * @param a int整型vector 数组a * @return int整型 */ int minDifference(vector<int>& a) { int ans=abs(a[0]-a[1]); for(int i=0;i<a.size();++i) for(int j=i+1;j<a.size();++j){ int te=abs(a[i]-a[j]); if (te<ans) ans=te; } return ans; } };
第二题 Tree IV:
可以枚举层数,计算出这层点的开始点编号与结束点编号,统计这层点的答案。
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param n long长整型 表示标准完全二叉树的结点个数 * @return long长整型 */ static const int p=998244353; long long tree4(long long n) { // write code here long long ans=0; for(long long i=1,l=1,r=1;l<=n;++i,l=l*2,r=r*2+1){ long long t=r; if (n<t) t=n; ans+=((l+t)*(t-l+1)/2)%p*i%p; } ans%=p; return ans; } };
一开始用python3写的,结果TLE。。。还是老老实实用C++写了
用贪心思想发现,如果将数字分为k-1个1位的数,和1个n-k+1位的数,并且这个n-k+1位的数的各个数位从高位到低位数码是从大到小排列的,则k个数相加得到的结果将是最大的(因为数码较大的数会得到尽可能高的权重)。由于数字的长度比较大,所以写点简单的高精度处理即可。
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 返回最大和的字符串 * @param x string字符串 即题目描述中所给字符串 * @param k int整型 即题目描述中所给的k * @return string字符串 */ int d[10],a[110000]; string ans; string Maxsumforknumers(string x, int k) { // write code here int n=x.length(); for(int i=0;i<10;++i) d[i]=0; for(int i=0;i<n;++i) d[x[i]-'0']++; for(int i=1;i<=n+10;++i) a[i]=0; int j=9,l=n-k+1; for(int i=l;i>=1;--i){ while (d[j]==0) --j; --d[j]; a[i]=j; } for(int i=1;i<k;++i){ while (d[j]==0) --j; --d[j]; a[1]+=j; } for(int i=1;i<=l;++i) if (a[i]>9){ a[i+1]+=a[i]/10; a[i]%=10; } while (a[l+1]){ ++l; if (a[l]>9){ a[l+1]+=a[l]/10; a[l]%=10; } } ans=""; for(int i=l;i>=1;--i) ans+=(char)(a[i]+'0');//ans+=!!!!!!! return ans; } };