测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A27708. 力量对比(power)在拔河比赛中,小胖的力量特别大,一人的力量能抵得过两人的力量,凭借着小胖的出色发挥,他所在的红队最终赢得了胜利。在拔河比赛中,这样的小胖越多越好啊,而体育老师想知道有多少位这样的小胖呢。假如我们给出所有学生的力量值,且任意两位学生的力量是不同的。如何能快速知道有多少位这样的小胖呢。输入: 输入共两行,第一行是一个正整数 n,表示共有 n 位同学。接下来一行为由空格分割的 n…

填空题 中等

题目描述

力量对比(power)

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

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

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

样例 1

输入:(power.in)

4

3 2 1 5

输出:(power.out)

2

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

样例 2

输入:(power.in)

70

97 51 57 30 94 3 23 77 72 92 38 8 46 41 37 70 27 26 28 39 32 54 49 9 68 16 42 6 40 90 59 99 36 98 13 55 76 18 24 20 21 85 17 19 43 93 63 29 33 12 62 83 91 73 34 1 81 14 89 53 75 84 52 67 44 100 66 25 47 10 

输出:(power.out)

66

数据范围

1≤n≤1000 0<序列中每个数≤1000

参考答案

#include<bits/stdc++.h> using namespace std; int b[1001]; //在主函数外定义数组,初值全赋0,该数组主要用来存储这个胖子之前能不能一抵二,避免重复计算 int main() { freopen("power.in","r",stdin); freopen("power.out","w",stdout); int ans=0,n; cin>>n; int a[n+1]; for(int i=1;i<=n;i++) { cin>>a[i]; } sort(a+1,a+1+n);//先从小到大排序,减少后期工作量 for(int i=1;i<=n-2;i++)//按顺序穷举 for(int j=i+1;j<=n-1;j++) { for(int m=j+1;m<=n;m++) { if(a[i]+a[j]<a[m]) break; //因为数组是按从小到大顺序的,所以找到比 a[i]+a[j]<a[m],后面的a[m+1]更大,不用再找了,减少工作量 if((a[i]+a[j]==a[m])&&b[m]==0) { ans++; b[m]=1;//记录胖子有没有找过 //cout<<a[i]<<"+"<<a[j]<<"="<<a[m]<<endl; } } } cout<<ans; fclose(stdin); fclose(stdout); return 0; }
上一题 下一题