A 最小差值
签到题,注意一下中途开ll就行
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 ans=a[1]-a[0]; for(int i=1;i<a.size();++i){ ans = min(ans,(a[i]-a[i-1])*1LL); } return int(ans); } };
B Tree IV
这是一个简单的模拟题,二叉树会分为两种层次。满层和未满层。两种的价值和其实都是一个等差数列。
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param n long长整型 表示标准完全二叉树的结点个数 * @return long长整型 */ const int mod = 998244353; long long tree4 (long long n) { long long cnt=1,ans=0,k=1; for(long long i=1;2*i<=n;i*=2,cnt++){ ans=(ans+cnt*(i+i*2-1)*i/2)%mod;///满层 k = i; } k*=2; return (ans+(k+n)*(n-k+1)/2%mod*cnt)%mod;///不满 } };
C、牛牛组数
简单模拟,最大一定是全部个位数和一个大数。于是在用数组模拟高精加减
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 返回最大和的字符串 * @param x string字符串 即题目描述中所给字符串 * @param k int整型 即题目描述中所给的k * @return string字符串 */ int a[200005]={0}; string Maxsumforknumers(string x, int k) { // write code here sort(x.begin(),x.end()); int t=x.length()-(k-1); int cnt=0; for(int i=k-1;i<x.length();i++){ a[cnt++]=x[i]-'0'; } int sum=0,l=0; for(int i=0;i<k-1;i++){ sum=0;l=0; a[l]+=sum+x[i]-'0'; while(a[l]>=10){ a[l]=a[l]%10; if(l+1>=cnt) cnt++; a[l+1]++; l++; } } string s1=""; for(int i=cnt-1;i>=0;i--){ s1+='0'+a[i]; } return s1; } };
D、
这题首先一看冒出的是这个公式 ans = (ans+(num/i)*(num%i)%mod)%mod;
但一看数据范围就知道我们不能用O(n)的解法,于是要开始寻找规律
我们可以发现会有一段一段的num/i是相等的,而且余数是等差的于是就有了这个
r = num/(num/l);
ans = (ans+((num%l+num%r)(r-l+1)/2)%mod(num/l)%mod)%mod;
于是程序就出来了
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 返回1-n的所有k*m的和 * @param num long长整型 正整数 n * @return long长整型 */ const int mod = 1e9+7; long long cowModCount(long long num) { // write code here long long ans=0; for(long long l=1,r;l<=num;l=r+1){ //ans = (ans+(num/i)*(num%i)%mod)%mod; r = num/(num/l);/// /完为同一个的个数 而且余数是等差的 ans = (ans+((num%l+num%r)*(r-l+1)/2)%mod*(num/l)%mod)%mod; } return ans%mod; } };