10675 ACMer不得不知道的事兒 二

2021-10-07 03:18:24 字數 2750 閱讀 5874

時間限制:1000ms **長度限制:10kb

提交次數:0 通過次數:0

題型: 程式設計題 語言: g++;gcc

description

作為乙個入門的acmer,在參加比賽之前,你勢必要了解演算法的一些基本概念,比如複雜度。

acm的題目,只要不是a+b級別的,總會需要一定的演算法來解決,即使是列舉,

也是叫做窮舉演算法。

乙個演算法的好壞,由它的複雜度來衡量,複雜度越高,演算法越低效。

複雜度包括不限於時間複雜度、空間複雜度和編碼複雜度,即其花費的時間、空間(即記憶體使用等)還有實現的難度。

第三個在做研究的時候不一定會考慮,但acm賽制是5個小時內決勝負,編碼複雜度也是至關重要的乙個因素。

一、時間複雜度

通俗講時間複雜度就是用來衡量演算法執行的時間的,它和問題的規模(通常用n表示,如果問題規模和不止乙個變數有關,

那用n,m,k等等表示)有關,規模越大,所花費的時間越長。越高效的演算法,在n增長的時候,執行時間增加的越少。

例如求1…n的和,下面有三種寫法:

普通寫法是:

int sum=0,i;

for(i=1;i<=n;i++)

sum+=i;

我們說它的時間複雜度是o(n)。因為執行一次,必須執行一次n長度的迴圈,n越大時間越大。對於每次迴圈,它需要執行

一次i++,一次sum+=i,一次判斷是否i<=n,可以說複雜度是o(3n),但是通常常數不被計入到複雜度的計算中,所以簡化為o(n)。

文藝寫法:

int sum=n*(n+1)/2;

複雜度o(1),很明顯執行一次只需要執行一次運算操作。

2b寫法:

int sum=0,i,j;

for(i=1;i<=n;i++)

嗯,很暴力很2b的o(n^2)複雜度,***。

說到這裡相信你已經對時間複雜度有了一定的了解了。
二、空間複雜度

所謂空間複雜度就是你用的記憶體的大小,簡單說就是你用了多少變數開了多大的陣列,malloc了多少記憶體,綜合起來就是了,

這點比較簡單,就不一一贅述。

三、編碼複雜度

編碼複雜度和你實現演算法所需要的時間有關,而且有時候和時間複雜度也有一定關係,但不是越高階的演算法越難實現,

像剛才的例子就是時間複雜度高了,編碼複雜度也跟著高了。

當你對演算法有了一定了解,在acm上收穫了不少知識之後,你甚至能在一些場合很輕鬆地解決掉一些問題,
並bs一些動手能力不強的人。

就好比某個牛津計算機系從本科讀到博士還經常考第一的人,可以花15分鐘的時間寫出類似這樣的**,
來求乙個陣列裡面,有多少數比它左邊的數都要大:

cnt=0;

for(i=0;i另外,我還要你求出有多少個數比它右邊都要小,同時,從小到大輸出他們的下標(從0開始)。

輸入格式

第一行,是乙個數t(t<=500),表示有多少組測試資料。

第二行乃至結束,是t組資料,對於每組資料:

第一行是乙個數n(1<=n<=100000),表示這個陣列的長度。

第二行是n個整數,有空格分隔。

輸出格式

對於每組資料,輸出四行:

第一行,乙個數a,表示有多少個數比它左邊都大

第二行,a個整數,表示比它左邊都大的數的下標

第三行,乙個數b,表示有多少個數比它右邊都小

第四行,b個整數,表示比它右邊都小的數的下標

請注意,那下標i,從左到右輸出也就是從小到大

輸入樣例24

1 3 1 4

51 2 3 2 1

輸出樣例

30 1 3

22 3

30 1 214

提示陣列太大要開成全域性變數,即放在函式體外,因為定義在函式體內部是占用函式棧的空間的,而函式棧空間比較小,

放裡面很容易造成爆棧然後得到「執行時錯誤」的結果。

另外,輸入流和輸出流是分開的,就是說,處理完一組資料,輸出答案,再處理第二組資料,再輸出第二組資料的答案,再處理第三組…,

這樣和處理完所有資料,再一次性輸出,是完全等價的。並且,系統評判的題目都是這樣,不需要儲存所有答案一併輸出。

之所以這題是(二)滴原因是去年有道一的了喲,看看有助於解決題目喲親~~~

** by lyd

作者 admin

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

int a[

100005];

int b[

100005];

int c[

100005];

intmain()

}int minv=

99999

,c1=0;

for(i=n-

1;i>=

0;i--

)//有多少個數比它右邊都小

} cout

0;i) cout<<<

' ';

cout

1;i>=

0;i--

) cout<<<

' ';

cout<}return0;

}

不得不知道的補碼知識

無論什麼程式語言,其 最終都會被編譯解釋成計算機可讀取和執行的二進位制資料。其中,數字在二進位制資料中可劃分成原碼 補碼和反碼。原碼 數值前面增了一位符號位 例如 10 和 10 的二進位制表示如下 10 的原碼 0000 1010 10 的原碼 1000 1010其中,最高位表示符號位,0 表示正...

程式猿不得不知道的業內「黑話」

程式猿的隊伍越來越龐大了,這裡整理了一些開發周邊的各個渠道的 黑話 趕快瞅瞅吧,別下次聽到時還是一頭霧水了!程式猿 沒必要做那麼複雜 複雜的我不會 外面大家都是這麼做的 我直接複製的 你這個需求不清晰 我不想做 目前技術實現不了 我不想做 那個 有句話 不知 專案要延期了 你告訴我輸什麼我自己來 你...

程式猿不得不知道的業內「黑話」

程式猿的隊伍越來越龐大了,這裡整理了一些開發周邊的各個渠道的 黑話 趕快瞅瞅吧,別下次聽到時還是一頭霧水了!程式猿 沒必要做那麼複雜 複雜的我不會 外面大家都是這麼做的 我直接複製的 你這個需求不清晰 我不想做 目前技術實現不了 我不想做 那個 有句話 不知 專案要延期了 你告訴我輸什麼我自己來 你...