A.
贪心使用,累加数组中的值,求和(0,a) 再加上 b,
#define ll long long
void solve(){
ll a,b,n;
cin >> a >> b >> n;
vector<ll>x(n);
for(int i = 0;i<n;i++){
cin >> x[i];
}
// sort(x.begin(),x.end(),greater<int>());
ll sum = b;
for(int i = 0;i<n;i++){
if(x[i]>=a) x[i]=a-1;
b+=x[i];
}
cout<< b << '\n';
}
B.
答案只有两种情况,遍历两次即可。
#define ll long long
void solve(){
int n,m,k;
cin >> n >> m >> k;
k--;
vector<int>a(n);
vector<int>b(m);
for(int i = 0;i<n;i++){
cin >> a[i];
}
for(int i = 0;i<m;i++){
cin >> b[i];
}
sort(a.begin(),a.end());
sort(b.begin(),b.end());
map<ll,bool>h;
vector<ll>ans;
int id;
int f = 1;
if(k&1) f++;
for(int i = 1;i<=f;i++){
if(i&1){
if(a[0]<b[m-1]){
swap(a[0],b[m-1]);
}
}
else{
if(b[0]<a[n-1]){
swap(b[0],a[n-1]);
}
}
sort(a.begin(),a.end());
sort(b.begin(),b.end());
}
ll sum = 0;
for(int j = 0;j<n;j++){
sum += a[j];
}
cout<<sum<<"\n";
}
C.
可以直接考虑苹果数量小于人数的情况,此时,每个苹果都要来上一刀,再把能分的先分一下,重复此过程,直到所有苹果都分完,
无解的情况:当人数除以人数和苹果数量的最大公因数不是2的幂时(一刀两半)
#define lowbit(x) (x&(-x))
void solve(){
ll n,m;
cin >> n >> m;
if(m/gcd(n,m)!=lowbit(m/gcd(n,m))){
cout<<"-1\n";
return;
}
ll ans = 0;
if(n%m==0) n = 0;
n%=m;
while(n){
ans+=n;
n*=2;
n%=m;
}
cout<<ans<<'\n';
}