1. 程式人生 > >NOI2.4基本演算法之分治 統計數字 分析----換一種思路

NOI2.4基本演算法之分治 統計數字 分析----換一種思路

一、題目描述

總時間限制: 1000ms 記憶體限制: 65536kB
描述

某次科研調查時得到了n個自然數,每個數均不超過1500000000(1.5*109)。已知不相同的數不超過10000個,現在需要統計這些自然數各自出現的次數,並按照自然數從小到大的順序輸出統計結果。

輸入
包含n+1行:
第一行是整數n,表示自然數的個數;
第2~n+1每行一個自然數。

40%的資料滿足:1<=n<=1000;
80%的資料滿足:1<=n<=50000;
100%的資料滿足:1<=n<=200000,每個數均不超過1500 000 000(1.5*10^9)。
輸出
包含m行(m為n個自然數中不相同數的個數),按照自然數從小到大的順序輸出。每行輸出兩個整數,分別是自然數和該數出現的次數,其間用一個空格隔開。
樣例輸入
8
2
4
2
4
5
100
2
100
樣例輸出
2 3
4 2
5 1
100 2
二、分析

最開始我用了桶排序,

#include<cstdio>
int main()
{
	int a[200005]={0},n,d=0,i,b[1500000005];
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(i=1;i<=d;i++)
		b[i]=0;
	for(i=1;i<=n;i++)
		b[a[i]]++;
	for(i=1;i<=d;i++)
		if(b[i]!=0)
			printf
("%d %d\n",i,b[i]); }

記憶體超限......

然後,我用了記錄a陣列中的最大數來定義b陣列,再進行桶排序

#include<cstdio>
int main()
{
	int a[200005]={0},n,d=0,i;
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		scanf("%d",&a[i]);
		if(a[i]>d)
			d=a[i];
	}
	int b[d];
	for(i=1;i<=d;i++)
		b[i]=0;
	for(i=1;i<=n;i++)
		b[a[i]]++;
for(i=1;i<=d;i++) if(b[i]!=0) printf("%d %d\n",i,b[i]); }

執行錯誤......

然後,我換了一種思路,將a陣列排序之後用1.7中過濾空格的方法來計算數字連續的個數
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
	int a[200005],n,i,x=0;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
	sort(a+1,a+n+1);
	for(i=1;i<=n;i++){
		if(a[i+1]>a[i]){
			printf("%d %d\n",a[i],x+1);
			x=0;
		}
		else 
			x++;
	}
}

答案錯誤......

無語.....  後來發現,最後一個數a[n],沒有比較的物件,a[n+1]為隨機值, 上面的程式碼中加了一條語句,提交上去之後,AC!!!!! 寫到這裡,我覺得在以後可以多用幾種方法,當一種思路行不通時,我們應該換一種思路,想一想其他的辦法,解題的效率才會提高。

相關推薦

NOI2.4基本演算法分治 統計數字 分析----思路

一、題目描述 總時間限制: 1000ms 記憶體限制: 65536kB描述 某次科研調查時得到了n個自然數,每個數均不超過1500000000(1.5*109)。已知不相同的數不超過10000個

NOI2.4基本演算法分治 求排列的逆序數 分析----也是醉了...

剛開始寫部落格,請大家多提意見 一、題目描述 總時間限制: 1000ms 記憶體限制: 65536kB 描述 在Internet上的搜尋引擎經常需要對資訊進行比較,比如可以通過某個人對一

Openjudge NOI題庫2.4基本演算法分治 7620:區間合併

 總時間限制: 1000ms 記憶體限制: 65536kB 描述 給定 n 個閉區間 [ai; bi],其中i=1,2,...,n。任意兩個相鄰或相交的閉區間可以合併為一個閉區間。例如,[1;2] 和 [2;3] 可以合併為 [1;3],[1;3] 和 [2;4] 可以

NOI2.2基本演算法遞迴和自呼叫函式 全排列 分析----如何寫全排列函式

一、題目描述 總時間限制: 1000ms 記憶體限制: 65536kB 描述給定一個由不同的小寫字母組成的字串,輸出這個字串的所有全排列。 我們假設對於小寫字母有'a' < 'b' < ... < 'y' < 'z',而且給定的字串中的字母已經按

Python基本演算法二分法查詢

二分法查詢是比較有序數列的中間值與指定查詢數的大小來找到查詢數下標值的,大大縮短查詢速度 二分法對序列的要求,必須是從小到大的有序數列,下面是兩種方法,一個是普通方法,另外一個是遞迴方法 普通方法: lst = [21, 22, 23, 24, 25, 26, 27,

演算法學習——貪心演算法幣種統計

演算法描述 幣種統計 單位給每一位員工發工資(精確到元),為了保證不臨時換零錢,使得每個員工取款的張數最少,在取工資前統計所有員工所需要的各種票面的張數(約定票種為100,50,20,10,5,2,1元),並驗證幣種統計是否正確 演算法思路 演算法描述其實是省略了要求,使用者肯定是要輸入員工數以及各

python五大基本演算法快速排序

快速排序的思想:首先選取一個基準數(一般為第一個數),然後將比它小得數放到左邊,比它大的數放到右邊,這一個過程稱為一趟快速排序。 一趟快速排序的演算法是: 1)設定兩個變數i、j,排序開始的時候:i=0,j=N-1; 2)以第一個陣列元素作為關鍵資料,賦值給ke

演算法"統計篇文章裡不同單詞的個數"

輸入: 有多組資料,每組一行,每行就是一篇文章。每篇小文章由小寫字母和空格組成,沒有標點符號,遇到#時表示輸入結束。 輸出: 每組輸入一個整數,其單獨成行,該整數代表一篇文章裡不同單詞的總數。 例如: hello world hello hi haha hh 

[CareerCup] 18.4 Count Number of Two 統計數字2的個數

18.4 Write a method to count the number of 2s between 0 and n.  這道題給了我們一個整數n,讓我們求[0,n]區間內所有2出現的個數,比如如果n=20,那麼滿足題意的是2, 12, 20,那麼返回3即可。LeetCode上有一道很類似的題

K-近鄰演算法手寫數字識別系統

定義將影象轉換為向量函式 # 匯入程式所需要的模組 import numpy as np import operator from os import listdir 讀取檔案 def img2vector(filename): returnVect = np.zero

【NOI】2971:抓住那頭牛/ 2.5基本演算法搜尋

2971:抓住那頭牛 檢視 提交 統計 提問 總時間限制:  2000ms   記憶體限制:  65536kB 描述 農夫知道一頭牛的位置,想要抓住它。農夫和牛都位於數軸上,農

[OpenJudge] 2.3基本演算法遞迴變遞推 PKU2506Tiling

一、原題 9273:PKU2506Tiling 總時間限制: 2000ms 單個測試點時間限制: 1000ms 記憶體限制: 131072kB描述 對於一個2行N列的走道。現在用1*2,2*2的磚去鋪

賽馬網基本演算法--馬路上的路燈

題目描述 城市E的馬路上有很多路燈,每兩個相鄰路燈之間的間隔都是1公里。小賽是城市E的領導,為了使E城市更快更好的發展,需要在城市E的一段長度為M的主幹道上的一些區域建地鐵。這些區域要是建了地鐵,就需要挪走相應的路燈。可以把長度為M的主幹道看成一個數軸,一端在數軸0的位置,另一端在M的位置;數軸上的每個

19:裝箱問題(4.6演算法貪心)

19:裝箱問題 總時間限制: 1000ms 記憶體限制: 65536kB 描述 一個工廠製造的產品形狀都是長方體,它們的高度都是h,長和寬都相等,一共有六個型號,他們的長寬分別為1*1, 2*2,

【NOI】1755:菲波那契數列/ 2.2基本演算法遞迴和自呼叫函式

傳送門:檢視 1755:菲波那契數列總時間限制:  1000ms   記憶體限制:  65536kB 描述 菲波那契數列是指這樣的數列: 數列的第一個和第二個數都為1,接下來每個數都等於前面2個數之和。 給出一個正整數a,要求菲波那契數列中第

【NOI】1696:逆波蘭表示式/ 2.2基本演算法遞迴和自呼叫函式

傳送門:檢視 1696:逆波蘭表示式 總時間限制:  1000ms   記憶體限制:  65536kB 描述 逆波蘭表示式是一種把運算子前置的算術表示式,例如普通的表示式2 + 3的逆波蘭表示法為+ 2 3。逆波蘭表示式的優點是運算子之間

【NOI】2469:電池的壽命/ 4.6演算法貪心

傳送門:檢視 2469:電池的壽命 總時間限制:  1000ms   記憶體限制:  65536kB 描述 小S新買了一個掌上游戲機,這個遊戲機由兩節5號電池供電。為了保證能夠長時間玩遊戲,他買了很多5號電池,這些電池的生產商不同,質量也

【NOI】2407:書架/ 4.6演算法貪心

先獻上傳送門:檢視 2407:書架 總時間限制:  20000ms   單個測試點時間限制:  1000ms   記憶體限制:  65536kB 描述 John最近買了一個書架用來存放奶牛養殖書籍,但書架很

基本演算法思想-分治演算法

package com.xj.www.algo; import java.util.Scanner; /** * 分治演算法 * * @author xiongjing * */ public class DivideTest { static int Fals

二、基本演算法DFS、BFS和A*

         圖中節點的遍歷和搜尋是老生常談的話題,這裡藉由python的networkx庫,複習一下之前的BFS和DFS,並對A*做一些理解。  1.BFS 廣度優先搜尋          其基本思想是優先從當前節點的鄰居節點開始搜尋,如果搜尋不到,再搜尋鄰居的鄰居。