【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; }