题目原文:http://codeforces.com/contest/1217/problem/A
题意:三个数a,b,c。。将c分配到a,b中,要分完。分完后a要严格大于b。有几种分法。
我的思路(菜菜鸟思路):分情况,a+c<=b,b>=a,剩下的a-b如果大于c,直接输出c+1,否则找到能够分给b最大的数即可。
AC代码
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 typedef long long ll; 5 int main(){ 6 int T; 7 cin>>T; 8 while(T--){ 9 ll a,b,c; 10 cin>>a>>b>>c; 11 ll num; 12 if(a+c<=b){ 13 cout<<"0"<<endl; 14 continue; 15 } 16 if(b>=a){ 17 num=b-a+1; 18 c-=num; 19 cout<<c/2+1<<endl; 20 } 21 else{ 22 num=a-b; 23 ll ans; 24 if(num>c){ 25 cout<<c+1<<endl; 26 continue; 27 } 28 ans=c-(c-num)/2; 29 cout<<ans<<endl; 30 } 31 } 32 return 0; 33 }
参考大佬代码后得到的大佬思路(细微更改):直接设b能放n个,a+c-n>=b+n+1 ,a+c-b-1>=2n,0<=n<=c。答案显而易见,注意当a+c-b-1小于0时,答案直接是0次。
AC代码
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 typedef long long ll; 5 int main(){ 6 int T; 7 cin>>T; 8 while(T--){ 9 ll a,b,c; 10 cin>>a>>b>>c; 11 //a+z-n>=y+n+1 12 //a+c-b-1>=2n 13 //0<=n<=c 14 ll ss=0; 15 ll num=a+c-b-1; 16 ll num1=max(num/2,ss); 17 if(num<0) num1=-2; 18 cout<<max(ss,min(num1+1,c+1))<<endl; 19 } 20 return 0; 21 }
心得:多运用数学知识,思维不能硬化,要活用脑