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;
}
};
京公网安备 11010502036488号