2 条题解

  • 0
    @ 2025-10-27 15:14:59
    #include <bits/stdc++.h>
    using namespace std;
    #define int long long
    int n,m,k;
    signed main() 
    {
    	ios::sync_with_stdio(false);
    	cin.tie(0),cout.tie(0);
    	int t;
    	cin >> t;
    	while(t--)
    	{
    		int res=0;
    		cin >> k >> n >> m;
    		if(k%2==0)
    		{
    			cout << (n+2*m)/k << endl;
    		}
    		else if(k==1)
    		{
    			cout << n+m << endl;
    		}
    		else
    		{
    			res=min(m/(k/2),n);
    			n-=res;
    			m-=(k/2*res);
    			if(m==0&&n==0)
    			{
    				cout << res << endl;
    				continue;
    			}
    			else if(m==0)
    			{
    				res+=(n/k);
    			}
    			else if(n==0)
    			{
    				res+=(m/((k+1)/2));
    			}
    			else
    			{
    				res+=((n+2*m)/k);
    			}
    			cout << res << endl;
    		}
    	}
    }
    

    k为偶数:不会浪费能量,直接算即可;

    特判k==1;

    k为奇数时:

    ex1 : 对于k=5,n=2,m=10的,每次充能先将小水晶填充一个,剩下全都用大水晶填充,res = 2;

    ex2 : 对于k=5,n=10,m=7,重复上面的过程,res = 3;

    m/(k/2)是按这种方式大水晶可以填充的块数,n就是这种方式小水晶可以填充的块数;

    再判断:

    (1)n=0,m=0,正好全部填充完;

    (2)n>0,m=0,直接算;

    (3)n=0,m>0,也可以直接算,注意(k+1),否则每次需要的块数少算一个;

    (4)n>0,m>0,此时必定为n>0,m<(k/2)(可以想一下为什么),直接算即可,大水晶的能量不可能被浪费.

    信息

    ID
    1156
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    (无)
    递交数
    284
    已通过
    33
    上传者