div2 880

B
银币总数kg,分配规则:r=x%g,如果r>=g/2(向上取整),实际获得x + (g - r),否则获得x-r
求节省的最大,对于每个人来说,最多能节省g/2(向上取整)-1个银币,但为了确保银币总数是k
g,可以让n-1个人节省g/2(向上取整)-1个银币,最后剩下的分给一个人
设x=g/2(向上取整)-1个,每个人最多节省x,n个人最多节省nx个,现在有n-1个x,一个y,无论y给出多少,不仅会让最后一个人损失,还会让前n-1个人损失,所以此时答案最大

include <bits/stdc++.h>

using namespace std;

define int long long

const int N=5010;
vector g[N];
int a[N];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
void solve()
{
int n,k,g,i,j;
cin >> n >> k >> g;
int ans=(n-1)((g+1)/2-1);
int res=k
g-ans;
if(res%g<=(g+1)/2-1)
ans+=res%g;
else ans=max(0ll,ans-(g-res%g));
cout << min(k*g,ans) <<endl;
return ;
}
signed main ()
{
int t;
cin >> t;
while(t--)
solve();
return 0;
}

C
暴力,感觉老是忽略掉暴力做法
数字a有a位数,那么a的范围就是[pow(10,a-1)+1,pow(10,a)-1]
数字b有b位数,那么b的范围就是[pow(10,b-1)+1,pow(10,b)-1]
数字a+b有c位数,那么a+b的范围就是[pow(10,c-1)+1,pow(10,c)-1]
数字b的范围就是[max(pow(10,c-1)-pow(10,a-1),pow(10,b-1)+1),min(pow(10,c)-pow(10,a),pow(10,b)-1)]
枚举a,对于一个固定的a,可以算出符合条件的b的范围,如果k当前小于区间长度,说明第k个就在此区间,在遍历一边b范围即可,否则k-区间长度
总复杂度为O(10的a次方+10的b次方)
pow可能会造成误差,用自写power

include <bits/stdc++.h>

using namespace std;

define int long long

const int N=5010;
vector g[N];
//int a[N];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
int power(int a, int e) {
if (e == 0) return 1;
return e == 1 ? a : a * power(a, e-1);
}
void solve()
{
int a,b,c,i,j,k;
cin >> a >> b >> c >> k;
for(i=power(10ll,a-1);i<=power(10ll,a)-1;i++)
{
int l=max(power(10ll,c-1)-i,power(10ll,b-1)),r=min(power(10ll,b)-1,power(10ll,c)-1-i);
int num=r-l+1;
if(l>r) continue;
if(k>num)
k-=num;
else
{
for(j=l;j<=r;j++)
{
k--;
if(k==0)
{
cout << i << " "<< "+" << " "<< j << " = " << i+j <<endl;
return ;
}
}
}
}
cout << -1 <<endl;
return ;
}
signed main ()
{
int t;
cin >> t;
while(t--)
solve();
return 0;
}

posted @ 2026-05-12 16:03  thy825  阅读(8)  评论(0)    收藏  举报