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