牛客编程巅峰赛S2第1场 - 青铜&白银场
一、A 最小差值
自己给自己挖的坑:int rt=(1<<31)-1;//不能用0x3f3f
PS:原因是测试数据范围很广
- 解法:排序+暴力
(1)本代码未能AC(测试时间2020.11.17比赛完)
本代码在比赛最初测试数据没有更新前能AC,更新后无法AC,只能过90%附近
- 根据牛油反馈修正
//注意,这个代码在更新数据后只能过90%,请勿拿这个代码测试
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 求最小差值 * @param a int整型vector 数组a * @return int整型 */ int minDifference(vector<int>& a) { // write code here sort(a.begin(),a.end()); int rt=(1<<31)-1;//不能用0x3f3f int len=a.size(); for(int i=1; i<len; ++i) { rt=min(rt, a[i]-a[i-1]); } return rt; } };
(2)测试数据更新后能AC的
AC 100%代码
推测添加的测试数据,一个是a[i]在(1<<31)-1附近,被减的a[i-1]是int中负数最大的附近
这样一减,就会溢出,大于int,所以可以用long long承载
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 求最小差值 * @param a int整型vector 数组a * @return int整型 */ int minDifference(vector<int>& a) { // write code here sort(a.begin(),a.end()); long long rt=(1<<31)-1; int len=a.size(); for(int i=1; i<len; ++i) { rt=min(rt, (long long)a[i]-(long long)a[i-1]); } return rt; } };
二、B Tree IV
(1)没AC的
较(2)AC的,坑点在于
long long cheng=(a+b)*(b-a+1)/2%maxn;
原先写的是
long long cheng=(a+b)*(b-a+1)%maxn/2;
PS:虽然先前那么写,小范围数据也能AC,但是到大范围的数据,就会发现,如果先模998244353,可能会导致精度出问题。
(2)AC的
- 解法:前缀和+数列求和
const int maxn=998244353; long long node[35]; long long sum[35];//第i层存节点数多少个,Sn节点个数 void init() { node[0]=0; sum[0]=0; node[1]=1; sum[1]=1; for(int i=2; i<31;++i) { node[i]=node[i-1]*2; sum[i]=node[i]; } for(int i=2; i<31; ++i) { sum[i]=sum[i]+sum[i-1]; } } class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param n long长整型 表示标准完全二叉树的结点个数 * @return long长整型 */ long long tree4(long long n) { // write code here init(); long long rt=0; if( 0==n ) { return 0; } if( 1==n ) { return 1; } int num=1; for(; num<31; ++num) { if( sum[num]>=n ) { break; } } for(int i=1; i<num; ++i) { long long a=sum[i-1]+1; long long b=sum[i]; long long cheng=(a+b)*(b-a+1)/2%maxn; long long temp=i*cheng%maxn; rt+=temp; rt%=maxn; } long long a=sum[num-1]+1; long long b=n; long long cheng=(a+b)*(b-a+1)/2%maxn; long long temp=num*cheng%maxn; rt+=temp; rt%=maxn; return rt; } };
三、C 牛牛组数
坑点:static const int maxn=100005;一行,在第一次提交的时候,没有加static关键字,“运行超时”,通过该90%样例
加上static之后,就AC了。
- 解法:模拟+贪心
static const int maxn=100005; class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 返回最大和的字符串 * @param x string字符串 即题目描述中所给字符串 * @param k int整型 即题目描述中所给的k * @return string字符串 */ //数字化后a>=0,b>=0 string add(string a,string b) { string ans; int aa[maxn]= {0}; int bb[maxn]= {0}; int lenA=a.size(); int lenB=b.size(); for(int i=0; i<lenA; i++) { aa[lenA-1-i]=a[i]-'0'; } for(int i=0; i<lenB; i++) { bb[lenB-1-i]=b[i]-'0'; } int num=max( lenA, lenB); for(int i=0; i<num; i++) { aa[i]+=bb[i]; aa[i+1]+=aa[i]/10; aa[i]%=10; } if(aa[num]) { ++num; } for(int i=num-1; i>=0; i--) { ans+=aa[i]+'0'; } return ans; } string Maxsumforknumers(string x, int k) { // write code here sort(x.begin(),x.end()); reverse(x.begin(),x.end()); --k; string rt="0"; while(k--) { rt=add(rt,string(1,x.back())); x.pop_back(); } rt=add(rt,x); return rt; } };