1. 程式人生 > >codeforces#486(div3)c

codeforces#486(div3)c

人生的第一篇部落格>_<(歡迎小夥伴來指教)/*補充一點基礎知識——c++的一個好玩的東西map,使用count()函式,返回的是被查詢元素的個數。有的話,返回1,否則為0;使用find()函式,返回的是被查詢元素的位置,沒有的話返回map.end().*/    這道題並不難,主要意思是要從給定的k個數組中,任意選出兩個,然後對每個選定的陣列刪除一個數,執行這波騷操作後,兩個陣列的元素和相等。   提供一個合理的思路哈——對每個陣列,我們記錄刪除任意一個元素後的元素和,之後輸入下一列陣列時,通過map對映,尋找前面的陣列是否有同樣的元素和,有的話,趕緊輸出YES嘍,否則為NO,具體實現前看下面的程式碼~~
#include<bits/stdc++.h>
using namespace std;

const int maxn = 2*1e5 + 5; 
int a[maxn];

int main()
{
    map<int , pair<int , int> > mp;    
    int T;
    scanf("%d", &T);
    for(int j = 0; j<T ; j++)
    {


        int num, sum = 0;
        scanf("%d" , &num);
        for(int i=0; i<num; i++)
        {
            scanf("%d", &a[i]);
            sum += a[i];
        }        

        for(int i=0; i<num; i++)
        {
            if(mp.count(sum-a[i]))
            {
                puts("YES");
                printf("%d %d\n%d %d\n", mp[sum-a[i]].first, mp[sum-a[i]].second, j+1, i+1 );
                //j 和 i 加1 是因為列數和下標都是從1開始計數,而程式碼中是從0開始,所以要人為加1
                return 0;
            }
        }

        for(int i=0; i<num; i++)
        mp[sum-a[i]] = {j+1, i+1};//標記上是第幾列 和 所在列數的下標


    }
    puts("NO");

}