问题标题: 酷町堂:3685

0
0
已解决
曹博扬
曹博扬
初级天翼
初级天翼

3685为啥10分?

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<iomanip>
#include<cmath>
#include<sstream>
using namespace std;
int n,a[2005],c,s;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			s=a[i]+a[j];
			for(int k=j+1;k<=n;k++){
				if(s==a[k])
					c++;
				else
					continue;
			}
		}
	}
	cout<<c;
	return 0;
}

 

曹博扬在2020-11-01 20:53:58追加了内容

3685   力量对比(power)经验值:400

不许抄袭,一旦发现,直接清空经验!

题目描述 Description

在拔河比赛中,小胖的力量特别大,一人的力量能抵得过两人的力量,凭借着小胖的出色发挥,他所在的红队最终赢得了胜利。在拔河比赛中,这样的小胖越多越好啊,而体育老师想知道有多少位这样的小胖呢。假如我们给出所有学生的力量值,且任意两位学生的力量是不同的。如何能快速知道有多少位这样的小胖呢。

输入描述 Input Description

输入共两行,第一行是一个正整数 n,表示共有 n位同学。
接下来一行为由空格分割的n个正整数,分别表示每一位同学的力量值。

输出描述 Output Description

只有一个正整数,为满足条件的数目。

样例输入 Sample Input

4 3 2 1 5

样例输出 Sample Output

2

数据范围及提示 Data Size & Hint

样例说明:因为3=1+2;5=2+3,所以输出为2。

数据范围:1≤n≤1000,0<序列中每个数≤1000


0
已采纳
陈则霖
陈则霖
资深光能
资深光能
  • for(int i=1;i<=n-1;i++)
  • {
  • for(int j=i+1;j<=n;j++)
  • {
  • if(b[a[i]+a[j]]!=0)
  • {
  • m++;
  • b[a[i]+a[j]]=0;
  • }
  • }
  •  
  • }
  • 核心
1
陈曦
陈曦
资深天翼
资深天翼

你要思路(A)还是代码(B)?

请选择😀......

~~~~~~~~~~~~~~~~~~~~~~~

好了!下边进入正题!

首先,说思路:

       这题用枚举可能会超时,所以用 桶 比较保险。

       首先,输入a[i],b[a[i]]++;

       双重循环遍历:

             如果 a[i]+a[j](用 tmp 存起来) 这个“小胖”存在,

             计数器加一,当前找到的  ”小胖“ 归 0(放重复)

        特别提示:这题的桶数组一定要定义大一些,因为小胖的体重会是其他两个人的两倍。

然后,是代码 (核心代码的伪代码):


    循环(1到n){
       输入a[i]
       b[a[i]]加一
    }

    循环(1 到 n){
        循环(i+1 到 n){
            整形 tmp 等于 a[i]加a[j]的和;  
            如果(b[tmp]){
                计数器加一;
                b[tmp]归0;
            }
        }
    }
    (输出计数器)

0
蒋文瀚
蒋文瀚
新手光能
新手光能

用桶。

给你一个if:

本人提交记录:

 

0
0
0
0
蔡乐毅
蔡乐毅
高级光能
高级光能

用桶,不然会超时

如果(s不超过1000&&b[s]!=0){

    b[s]--;//避免重复

    c++;

}

我要回答