2021-2022-1 ACM集训队每周程序设计竞赛 - 问题 B: 求和 - 题解

Posted Tisfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-2022-1 ACM集训队每周程序设计竞赛 - 问题 B: 求和 - 题解相关的知识,希望对你有一定的参考价值。


求和

时间限制:2秒
空间限制:256M


题目描述

小T给你两个整数 K K K S S S,问你有多少个不同的三元组 ( X , Y , Z ) (X, Y, Z) (X,Y,Z)满足:

  • X + Y + Z = S X+Y+Z=S X+Y+Z=S
  • 0 ≤ X , Y , Z ≤ K 0\\leq X,Y,Z\\leq K 0X,Y,ZK

输入描述

一行空格隔开的两个整数 K 和 S K和S KS,其中

  • 2 ≤ K ≤ 2500 2\\leq K\\leq 2500 2K2500
  • 0 ≤ S ≤ 3 K 0\\leq S\\leq 3K 0S3K

输出描述

输出满足条件的三元组的个数


样例一

输入

2 2

输出

6

提示

  • ( 0 , 0 , 2 ) (0,0,2) (0,0,2)
  • ( 0 , 2 , 0 ) (0,2,0) (0,2,0)
  • ( 2 , 0 , 0 ) (2,0,0) (2,0,0)
  • ( 0 , 1 , 1 ) (0,1,1) (0,1,1)
  • ( 1 , 0 , 1 ) (1,0,1) (1,0,1)
  • ( 1 , 1 , 0 ) (1,1,0) (1,1,0)

题目分析

这道题有点像学习C语言基础时候的鸡兔同笼问题,只是 3 3 3层循环复杂度 O ( k 3 ) O(k^3) O(k3)会超时,所以用两层循环复杂度 O ( k 2 ) O(k^2) O(k2)即可。

第一层循环枚举第一个数 i i i,第二层循环枚举第二个数 j j j,因为三个数之和是 S S S,所以第三个数 r r r必是 S − i − j S-i-j Sij。只需要判断 r r r是否属于 0 ∼ k 0\\sim k 0k即可。


AC代码

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int k,s;
    cin>>k>>s;
    int ans=0;
    for(int i=0;i<=k;i++)
    {
        for(int j=0;j<=k;j++)
        {
            int r=s-i-j;
            if(0<=r&&r<=k)
                ans++;
        }
    }
    cout<<ans<<endl;
    return 0;
}

原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/120225806

以上是关于2021-2022-1 ACM集训队每周程序设计竞赛 - 问题 B: 求和 - 题解的主要内容,如果未能解决你的问题,请参考以下文章

BUCT - 2021-2022-1 ACM集训队每周程序设计竞赛(10)题解

BUCT - 2021-2022-1 ACM集训队每周程序设计竞赛题解

BUCT - 2021-2022-1 ACM集训队每周程序设计竞赛题解

BUCT - 2021-2022-1 ACM集训队每周程序设计竞赛题解

2021-2022-1 ACM集训队每周程序设计竞赛题解

2021-2022-1 ACM集训队每周程序设计竞赛题解