洛谷-P2141 [NOIP2014 普及组] 珠心算测验

本题难点在于每个和的数只能被记录一次,因此需判断是否有不同的两个值相加相等。
两个思路
1.再建立一个数组,当符合条件时载入数组,载入之前遍历数组是否已有这个值
2.建立结构体数组,直接给每个成员多加一个判断数值,若符合条件则将判断数值修改 
 


 //写法一

int main()
{
    int n;
    int arr[20000] = { 0 }, tmp = 0;//别问我20000哪来的,问就是试出来的
    int* p;
    cin >> n;
    p = new int[n];

    for (int i = 0; i < n; i++)
    {
        cin >> p[i];
    }
    //暴力遍历每个数,并把每个符合条件的数载入数组arr 
    for (int i = 0; i < n - 1; i++)
    {
        for (int k = i + 1; k < n; k++)
        {
            for (int j=0 ;j < n; j++)
            {
                if (p[i] + p[k] == p[j])
                {
                    arr[tmp++] = p[j];
                }
            
            }
        }
    }

    //遍历arr,统计其不相同的数 
    int arr2 = 0;
    for (int i = 0; i < 20000; i++)
    {
        int tmp2 = arr[i];
        if (tmp2 != -2 && tmp2 != 0)    arr2++;
        for (int k = i; k < 20000; k++)
        {
            if (arr[k] == tmp2)
            {
                arr[k] = -2;//将相同的数 改为不存在的-2,并以此作为 
            }
        }
    }

    cout << arr2;

    return 0;
}
 

 //写法2
struct shu
{
    int num;
    int ta = 0;.//用于标志是否被计数
};

int main()
{
    int n,cnt=0;
    cin >> n;
    shu* p = new shu[n];
    for (int i = 0; i < n; i++)
    {
        cin >> p[i].num;
    }
    for (int i = 0; i < n-1; i++)
    {
        for (int k = i + 1; k < n; k++)
        {
            for (int j = 0; j < n; j++) 
            {
                if (p[i].num + p[k].num == p[j]. num)
                {
                    p[j].ta = 1;.//最重要的区别就在这。将每个符合条件的成员标志都改为1
                }
            }
        }
    }
    for (int i = 0; i < n; i++)
    {
        cnt += p[i].ta;//直接相加就可以求得总过有多少个数符合条件
    }
    cout << cnt << endl;


    return 0;
};

你可能感兴趣的:(没发现问题的题,c++)