题解 CF1023B 【Pair of Toys】

· · 题解

题目大意

输入两个数n,k,问从1~n中取出2个数使得它们的和为k的方案数((a,b)(b,a)算同一种方案)

题解

如果a+b==k,那么(a+1)+(b-1),(a+2)+(b+2)……也等于k。所以我们可以找到最接近的两个数k/2,k/2+1,然后1~k/2(k/2+1)~(k{-}1)就是所有的方案。接下来我们只需要找出合法的方案数就可以了

首先我们可以确定如果k/2{>=}n,肯定无解,当k/2{<}n的时候,因为n可能小于k,所以合法的方案数应为\min(k/2,(k-1)-k/2,n-k/2)

P.S. 不要忘了开long\; long

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
    long long n,k; cin>>n>>k;
    long long mid=k/2,ans;
    if(mid<n) ans=min(mid,min(k-1-mid,n-mid));
    else{
        cout<<0; return 0;
    }
    cout<<ans;
    return 0;
}