打表思想

时间:2024-01-22 07:37:25

题目描述

珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。

某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?

最近老师出了一些测验题,请你帮忙求出答案。

(本题目为2014NOIP普及T1)

输入输出格式

输入格式:

 

共两行,第一行包含一个整数nn,表示测试题中给出的正整数个数。

第二行有nn个正整数,每两个正整数之间用一个空格隔开,表示测试题中给出的正整数。

 

输出格式:

 

一个整数,表示测验题答案。

 

输入输出样例

输入样例#1: 复制
4
1 2 3 4
输出样例#1: 复制
2

提及: 

打表是一种编程技巧,今天看到这道题目,感觉有点意思,索性记录一下,就是打表思想的应用: 当然这里还可以使用set ,以及Java中的hashset

 

普通写法:

 

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,a[100],b[100],bk=0;//首先,定义变量,n是数的数量,a是数字,b是为了排除掉重复的,bk是为了记录(book)
    cin>>n;//读入
    for(int i=0;i<n;i++){
        cin>>a[i];//读入
        b[i]=2;//注意,这里是重点,很多人没有满分都是因为这个,把重复的计算进去了,所以在这里我们需要一个类似开关的东西来表示它到底是否重复了,如果为2就是没动过的,如果为1就是动过的
    }
    for(int i=0;i<n;i++){//因为只需要两个数两个数地计算,所以可以简单地弄两个循环,这里是数学的规律,如:1,2,3,4这四个数中选择两个数相加,要所有的组合方式,我们有1,2、1,3、1,4、2,3、2,4、3,4
        for(int o=i+1;o<n;o++){
            for(int p=0;p<n;p++){//重复地把所有的数挨个测试一遍是不是所有组合的和
                if(a[p]==a[i]+a[o]&&b[p]!=1){//判定是否是所有组合的和。为了唯一性,所以要测试a是不是被动过的,b就是在这里派上用场的
                    bk++;
                    b[p]=1;//如果没动过就把a对应的b设成动过的
                }
            }
        }
    }
    cout<<bk;//输出
    return 0;
}

 

 

打表写法:

 

package chapter.array;

import java.util.Scanner;

public class P2141 {
    
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int res=0;
        // t l 分别是标记数组
        int [] t=new int[10000];
        int [] l=new int[10000];
        int [] a=new int[in.nextInt()];
        for (int i = 0; i < a.length; i++) {
            a[i]=in.nextInt();
            t[a[i]]=1;
        }
        for (int i = 0; i < a.length; i++) {
            for (int j = i+1; j < a.length; j++) {
                l[a[i]+a[j]]++;
            }
        }
        // 下标相同并且又避免的出现相同的题设
        for (int i = 0; i < l.length; i++) {
            if(l[i]>0&&t[i]==1)res++;
        }
        System.out.println(res);
    }

}