2 条题解
-
0
#include <stdio.h> int main(){ int k,n,m,x; scanf("%d",&x); while(x--){ scanf("%d %d %d",&k,&n,&m); int sum=0; if(k%20){ sum=(n+2*m)/k; printf("%d\n",sum); } else if(k1){ sum=m+n; printf("%d\n",sum); } else { sum=m/(k/2)<n?m/(k/2):n;//将2和1配组 ,完整的几个2和1成一组,取完整组数,即要最小值,无论2多或少或1 或多或少,都不是完整的一个1加几个2 n-=sum;//一次用一个1 m-=(k/2sum);//sum次用了几个大水水晶球 if(m0&&n0){ printf("%d\n",sum); } else if(m0){ sum+=n/k; }else if(n0){ sum+=m/((k+1)/2);//k+1是因为k为奇数,加1变为偶数,除以二得到需要大水晶球的个数,然后m/(k+1)/2,为剩余的大水晶球能充能几次 }else { sum+=((n+2m)/k); } printf("%d\n",sum); } } return 0; }
-
0
#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)(可以想一下为什么),直接算即可,大水晶的能量不可能被浪费.
- 1
信息
- ID
- 1156
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 305
- 已通过
- 36
- 上传者