有n個數,兩兩組成二元組,相差最小的有多少對呢?相差最大呢?
45 12 45 32 5 6
輸入包含多組測試資料。對於每組測試資料:
n - 本組測試資料有n個數
a1,a2...an - 需要計算的資料
保證: 1<=n<=100000,0<=ai<=int_max.
1 2(第乙個數表示差最小的對數,第二個數表示差最大的對數)
1.0對所有輸入數字,建也給int s[int_max] 陣列,陣列下標表示數值大小,陣列的值表示該數字出現次數。
"size of array s is too large!"(陣列開太大了 不可行!)
2.0 參考了網上的map
1、不用陣列,改用map(節省空間,且map儲存是對key從小到大排好序的)
2、差值最小的對數
首先統計value>=2的關鍵字x,若存在,則最小差值為0,可求次數。
若不存在,則遍歷求最小差值(直接遍歷就好了,map是排好序的呀orz,逐一遍歷,求關鍵字的最小差值以及相應次數。
3、差值最大的對數
最大元素-最小元素(map是排好序的 太方便了)
map.begin()->first 最小數字
map.rbegin()->first 最大數字(注意用map.end()不行,因為end指的是map最後乙個元素之後的那個,溢位map了,是個未知數)
(1)一些tips
map使用
//建立
#includemapm;
//插值
m[2]=1;//m[key]=value;
//遍歷
map::iterator it;
for(it=m.begin();m!=m.end();m++)
cout//map都是按key有序的。最小元素m.end(),最大元素m.rbegin() 不可m.end()!!!
cout(寫了好久 map使用太不熟練了!first--key, second--value老是搞反了!)
第一次提交90%,沒注意到2 2 2 2和2 4 6 8的區別,2 2 2 2 的時候 max不可以用m*n計算噠;另外min最小值遍歷的時候,不能遍歷到最後乙個,要最後前乙個,不然等下會把map.end()卷進來,然後結果就被隨機啦(map.end()是指最後乙個元素的後乙個元素,那個是未知的)我不知道為什麼map.rbegin()不可以作為賦值使用,所以很笨地用了--map.end()來得到map中的最後乙個元素。另外,**真的好醜啊啊啊(蒻能ac就行了不是嗎(?)
#include #include#include#include#includeusing namespace std;
int main()
//max
map::iterator mi=m.begin();
int maxx,minn;
if(mi->first==m.rbegin()->first)
else maxx=mi->second*m.rbegin()->second;
//min
//遍歷查詢value>1的元素
map::iterator it;
int p;int sum=0;
for(it=m.begin();it!=m.end();it++)
} if(sum==0)//沒有重複的元素
if(li>t2-t1)}}
minn=sum;
cout《好了tx去年三道程式設計題至此做完了!都不難!繼續努力!!明天晚上加油!!!
RMQ演算法求最大最小差值
時間限制 2000 ms 記憶體限制 65535 kb 難度 5 描述 南將軍統率著n個士兵,士兵分別編號為1 n,南將軍經常愛拿某一段編號內殺敵數最高的人與殺敵數最低的人進行比較,計算出兩個人的殺敵數差值,用這種方法一方面能鼓舞殺敵數高的人,另一方面也算是批評殺敵數低的人,起到了很好的效果。所以,...
CCF CSP 最小差值
最小差值 試題編號 201712 1 試題名稱 最小差值 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 給定n個數,請找出其中相差 差的絕對值 最小的兩個數,輸出它們的差值的絕對值。輸入格式 輸入第一行包含乙個整數n。第二行包含n個正整數,相鄰整數之間使用乙個空格分隔。輸出格式...
CCF 最小差值
試題編號 201712 1 試題名稱 最小差值 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 給定n個數,請找出其中相差 差的絕對值 最小的兩個數,輸出它們的差值的絕對值。輸入格式 輸入第一行包含乙個整數n。第二行包含n個正整數,相鄰整數之間使用乙個空格分隔。輸出格式 輸出乙個...