日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2020年牛客算法入门课练习赛1【完结】

發(fā)布時間:2025/3/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2020年牛客算法入门课练习赛1【完结】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

感覺題挺不錯的,自己也覺得做過很多題了,但是做這一套題還是有的題有些許不會。

目錄

  • 第k小數(shù)【難度: 簡單 / 快排】
  • 不平行的直線【難度: 簡單 / 數(shù)學】
  • 丟手絹【難度: 一般 / 取尺法 雙指針】
  • 二分【難度: 中 / 知識點: 差分】
  • 交換【難度: 中 / 求環(huán)】

第k小數(shù)【難度: 簡單 / 快排】


https://ac.nowcoder.com/acm/contest/5773/A

#include<bits/stdc++.h> using namespace std; const int N=1e7+10; int a[N],t,n,k; inline int read(){int x = 0, f = 1;char ch = getchar();while(ch < '0' || ch > '9'){if (ch == '-')f = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){x = (x<<1) + (x<<3) + (ch^48);ch = getchar();}return x * f; } int main(void) {t=read();;while(t--){n=read(); k=read();for(int i=1;i<=n;i++) a[i]=read();sort(a+1,a+n+1);printf("%d\n",a[k]);}return 0; }

不平行的直線【難度: 簡單 / 數(shù)學】


https://ac.nowcoder.com/acm/contest/5773/B
就是求不同的斜率的數(shù)量。

#include<bits/stdc++.h> using namespace std; typedef pair<int,int> PII; int gcd(int a,int b) {return b?gcd(b,a%b):a;} vector<PII>ve; int n; set<PII>st; int main(void) {cin>>n;for(int i=0;i<n;i++){int a,b; cin>>a>>b;ve.push_back({a,b});}for(int i=0;i<ve.size();i++){for(int j=i+1;j<ve.size();j++){int a=ve[i].first,b=ve[i].second;int c=ve[j].first,d=ve[j].second;int s1=c-a,s2=d-b; int temp=gcd(s1,s2);st.insert({s1/temp,s2/temp});}}cout<<st.size()<<endl;return 0; }

丟手絹【難度: 一般 / 取尺法 雙指針】


https://ac.nowcoder.com/acm/contest/5773/C
尺取法,用雙指針維護,對于一個點我們的最大結果一定是盡可能的平分。

#include<iostream> using namespace std; int a[100010] = {0};int main(){int n;cin >> n;int l = 0, sum = 0;//l在前,i在后for(int i = 0; i < n; i++){cin >> a[i];sum += a[i];}int temp = 0;//兩者間的距離int ans = 0, jin;for(int i = 0; i < n; i++){while(temp < sum / 2){//l為前面的temp += a[l % n];//l % n因為是一個圈,在l = n時 又從a[0]開始加起l++;}jin = min(temp, sum - temp);//sum可能為奇數(shù),一般會向下取整,判斷較小的那半圈ans = max(ans, jin);//最大值temp -= a[i];}cout << ans << endl;return 0; }

二分【難度: 中 / 知識點: 差分】


https://ac.nowcoder.com/acm/contest/5773/D
居然是差分,太秒了。數(shù)據(jù)范圍很大,故直接用map來映射

#include<bits/stdc++.h> using namespace std; const int N=1e5+10; const int inf=INT_MAX; map<int,int>mp; int n=0; void insert(int l,int r) {mp[l]++;mp[r+1]--; } int main(void) {cin>>n;for(int i=0;i<n;i++){int a; char b;cin>>a>>b;if(b=='.') insert(a,a);//給a這個位置加1if(b=='+') insert(-inf,a-1);//給 [-inf,a-1] 這段區(qū)間加1if(b=='-') insert(a+1,inf-1); //給 [a+1,inf-1]這段區(qū)間加1 因為我們的結果是不大于inf的,故是inf-1}int ans=-1e9,sum=0;for(auto i=mp.begin();i!=mp.end();i++){sum+=i->second;ans=max(ans,sum);}cout<<ans<<endl;return 0; }

交換【難度: 中 / 求環(huán)】


https://ac.nowcoder.com/acm/contest/5773/E
數(shù)據(jù)范圍很大故先離散化一下,再進行。
很經(jīng)典的一個問題,我們可以用圖論的思路來解決。
我們的最終目的是n個自環(huán),cnt用來當前有幾個環(huán),n-cnt就是我們還需要的環(huán)數(shù),即為答案。

#include<bits/stdc++.h> using namespace std; const int N=200010; int s[N],temp[N]; int vis[N]; int n,cnt; map<int,int>mp; int main() {cin>>n;for(int i=1;i<=n;i++) scanf("%d",&s[i]),temp[i]=s[i];sort(temp+1,temp+n+1);for(int i=1;i<=n;i++) mp[temp[i]]=i;for(int i=1;i<=n;i++) s[i]=mp[s[i]];//離散化for(int i=1;i<=n;i++){if(!vis[s[i]]){for(int j=s[i];!vis[j];j=s[j]) vis[j]=1;cnt++;}}cout<<n-cnt;return 0; } 《新程序員》:云原生和全面數(shù)字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的2020年牛客算法入门课练习赛1【完结】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。