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

  • 2019 年 11 月 8 日
  • 筆記

版權聲明:本文為部落客原創文章,遵循 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;  }