牛客寒假演算法基礎演算法訓練營2

2021-09-10 04:37:18 字數 2812 閱讀 9931

1、**座與重修費

題目描述

期末考試結束了,**座發現很多人掛了大物,只能等著第二年重修,還要交400元的重修費。**座突然想起有個學長和他講過,如果學校哪一年缺錢了,那一年的大物試卷就會特別難。現在**座有了所有人的成績,**座想知道如果所有掛科的人都在第二年重修,學校能賺多少重修費?

掛科是指一門課的分數小於60分。

輸入描述:

第一行乙個整數n,表示考試的人數。

第二行n個整數,表示每個人的成績。

1<=n<=10000

學生的成績為0-100(包括0和100)之間的整數

輸出描述:

一行,學校能賺的重修費用

示例1輸入460

56100

59輸出

800這才是真正的簽到題,沒什麼難度,給你點小自信假裝很簡單

#includeusing namespace std;

int main()

cout<2、**座的期末複習

題目描述

快要期末考試了,**座現在有n門課程需要考試,每一門課程需要花ai小時進行複習,考試的起始時間為bi,**座為了考試可以不吃飯不睡覺,**座想知道他能否複習完所有的科目(即在每一門考試之前複習完該科目)。每一門課的考試時間都為兩小時。

輸入描述:

第一行乙個整數n

第二行n個整數a1,a2,…,an,表示每門課需要複習的時間

第三行n個整數b1,b2,…,bn,表示每門課考試的時間

1<=n<=105

0<=ai<=109

0<=bi<=109

輸出描述:

如果**座能複習完,輸出」yes」,否則輸出」no」

示例1輸入

30 1 1

2 6 4

輸出yes

說明在0-1小時複習第2門課,

在1-2小時複習第3門課,

在2-4小時考第1門課,

在4-6小時考第3門課,

在6-8小時考第2門課

備註:考試時不能複習,保證考試時間不會重疊。

複習可以拆開,只要複習時間夠了即可。

乙個比較基礎的貪心演算法題,先根據輸入的資料sort一下,當考試時間相同時按照複習需要時間,不相同時按照考試時間排序,之後從最早考試的那一科開始,如果滿足已經用的時間<=考試時間就說明可以滿足條件,已經用的時間為考試時間加上覆習時間。

ac**如下

#includeusing namespace std;

struct node ;

struct node n[100005];

long long int t;

bool cmp(struct node a,struct node b)

edge[maxm];

int head[maxn],tot;//tot用於記錄當前存入的邊數 ,head用於記錄最後乙個輸入的以這個點為起點的邊

void init()

void addedge(int u,int v)

int low[maxn],dfn[maxn],stack[maxn],belong[maxn];

int index,top;

int scc;

bool instack[maxn];

int num[maxn];

/*dfn[ i ] : 在dfs中該節點被搜尋的次序(時間戳)

low[ i ] : 為i或i的子樹能夠追溯到的最早的棧中節點的次序號

當dfn[ i ]==low[ i ]時,為i或i的子樹可以構成乙個強連通分量

*/ void tarjan(int u)//用於找最大強連通分量

else if(instack[v] && low[u] > dfn[v])

low[u] = dfn[v];

}if(low[u] == dfn[u])

while(v != u);

}} bool solvable(int n)//n表示寶箱個數的兩倍

int n,m;

int a[200005];

vectorv[200005];

int main()

if (a==s) can=1;}}

if (can==1) puts("yes");

else puts("no");

}else if ((int)b.length()==(int)a.length()-2)//減少兩位

}if (can==1) puts("yes");

else puts("no");

}else if (b.length()==a.length()+1)//增加一位

if (can==1) puts("yes");

else puts("no");

}else if ((int)b.length()==(int)a.length()-1)//減少一位

if (can==1) puts("yes");

else puts("no");

}else//沒有數字上的變化

if (cnt==0) can=1;

}}//這一重迴圈用於解決寫錯兩個字母的情況,除了兩個字母其他都一樣,這時符合條件

for (int i=0;i}//沒有數字變化的情況第二類可能是只寫錯了乙個字母,但兩次寫錯的位置都是一樣的且第二寫錯的字母不是正確的字母

if(a==b) can=1;//如果兩次都是乙個位置上的字母出錯,且第二次正好錯了回來,這種情況也是符合條件的

if (can==1) puts("yes");

else puts("no");}}

return 0;

}

牛客寒假演算法訓練營2 建通道

輸出一行,乙個整數表示答案。示例1 複製2 1 2複製 對於此題來說,拋去所有附加條件不管,是乙個mst問題。然鵝對於這種資料範圍,即使處理了重複的點再去建邊跑kruskal也是不科學的 將信將疑於是乎我們來思考別的解法。首先,毋庸置疑,肯定是去重,因為異或相同為0嘛,沒有花費當然要連咯。其次,對於...

牛客寒假演算法基礎訓練營6

早知道這次題目這麼簡單就認真做了,最後一場沒心做,後面懶得想了,唉罪過罪過 1 煤氣灶 題目描述 小j開始打工,準備賺錢買煤氣灶。第一天,小j的工資為n元,之後每天他的工資都比前一天多d元。已知煤氣灶需要m元,求小j最少工作幾天才能買到煤氣灶。輸入描述 四個整數 n,m,d,x 分別表示小j第一天的...

牛客寒假演算法基礎訓練營1 G

這道題的題解講的非常好了已經,對於1 n數的排列子區間 l,r 使得區間中的數滿足連續的條件為 r l max a l r min a l r l,r為下標 既然要使 l,r 為萌區間,那麼就要找到這個區間內的最大值mx與最小值mn,判斷是否滿足條件 若不滿足條件,那麼需要將 mn,mx 缺少的數字...