天天看點

【PAT乙級】是否存在相等的差

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協定,轉載請附上原文出處連結和本聲明。

本文連結:https://blog.csdn.net/weixin_42449444/article/details/84842638

題目描述:

給定 N 張卡片,正面分别寫上 1、2、……、N,然後全部翻面,洗牌,在背面分别寫上 1、2、……、N。将每張牌的正反兩面數字相減(大減小),得到 N 個非負內插補點,其中是否存在相等的差?

輸入描述:

輸入第一行給出一個正整數 N(2 ≤ N ≤ 10 000),随後一行給出 1 到 N 的一個洗牌後的排列,第 i 個數表示正面寫了 i 的那張卡片背面的數字。

輸出描述:

按照“內插補點 重複次數”的格式從大到小輸出重複的內插補點及其重複的次數,每行輸出一個結果。

輸入樣例:

8
3 5 8 6 2 1 4 7           

複制

輸出樣例:

5 2
3 3
2 2           

複制

解題思路:

額,我把這道水題寫成部落格,主要是想比較一下map在利用for循環進行周遊和for-each循環進行周遊的差別。

AC代碼:

#include <bits/stdc++.h>
using namespace std;

int main()
{
    map<int,int,greater<int>> m;  
    //map的第三個參數compare(預設為less<int> 升序),降序需要改成greater<int>
    int N;
    cin >> N;
    for (int i = 1; i <= N; i++)
    {
        int temp;
        cin >> temp; //洗牌後的排列
        m[abs(temp-i)]++;
    }
    for(auto it=m.begin();it!=m.end();it++)
    {
        if(it->second > 1)
        {
            cout << it->first << " " << it->second << endl;
        }
    }
    /* 最後那個for循環換成for-each循環也可以AC,需要注意的是for-each循環中不能寫it->first,需要改成it.first
    for(auto it:m)
    {
        if(it.second > 1)
        {
            cout << it.first << " " << it.second << endl;
        }
    }
    */
    return 0;
}           

複制