學習時間與內容
for
(int d=n/
2;d>
0;d/=2
)//shell排序增量
}
2.二分樣例
在我農場上有n頭牛(1<=n<=50000),我想出了乙個雜技特技:站到彼此上面,形成乙個有一定高度的垂直堆疊,我就讓這些牛來練習這個雜技,牛正在試圖弄清楚它們應該在這堆奶牛中排列的順序。每頭n頭牛具有相關的體重(1<=w_i<=10000)和強度(1<=s_i<=1000000000)。一頭牛倒下的風險等於它身上所有牛的總體重(當然不包括它自己的體重)減去它的強度(這樣一來,一頭更強壯的牛的風險就更低)。你的任務是確定牛的順序,使任何一頭牛的最大風險最小化。
格式輸入格式
第1行:整數n為單行。
行2…n+1:行i+1用兩個空分整數w和s描述牛。
輸出格式
乙個單一的整數,給出所有奶牛的最大風險,在任何優化排序,使風險最小化。
這道題的難點主要是搞清怎樣能使得風險最小化,每頭牛都有乙個體重和乙個強度,風險的值為這頭牛以上不包括它本身的體重減去它的強度。如果只對強度和體重或者他們的比值進行排序都不可能達到最大風險的最小化。
所以可以這樣理解,強度越大它能夠承受的體重也就越大,所以強度越大就越放在下面來承受更大的體重。體重越大就需要強度越大的牛來承受它,所以為了避免這種情況,我們也把體重越大的放在下面,以免壓垮下面的牛。
所以我們應該對體重和強度的和來進行排序,越大的越在下面。排好序就可以來乙個字首和掃一遍,用字首和的體重減去這頭牛的體重,因為是求奶牛的最大風險,所以我們比較最終保留乙個風險最大值。
這裡還有乙個值得注意的地方最上面那頭牛(第一頭牛)也要用它字首和體重減去它的強度(雖然第一頭牛的字首和體重為0)風險值為負。因為整體最大風險的值也可能是負數,假設第i頭牛的字首和體重減去它的強度即為:sum—s<0假設為 4-7=-3,而第一頭牛的字首和體重為0(因為它上面沒牛嘛),強度為2那麼它的風險為-2,我們找的是最大風險值,很明顯-2>-3所以,第一頭牛的風險值更大一點。因此,我們必須從最上面那頭牛(也就是第一頭牛)開始迴圈。這也是我wa好幾次,我改了下值發現的。
下面看下我的ac**:
#include
struct node
;struct node a[
50000+10
];int n;
void
sort
(int left,
int right)
} a[left]
=a[i]
; a[i]
=temp;
sort
(left,i-1)
;sort
(i+1
,right);}
intmax
(int a,
int b)
intmain()
sort(0
,n-1);
//用個快排,以免資料過大會時間超限
for(i=
1;i)//這裡是字首和所以從第二頭牛開始
a[i]
.v=a[i-1]
.w+a[i-1]
.v;//字首和,對上面的牛的體重累加
for(i=
0;i)//第一頭牛也要算風險值,即便這個風險值為負數
ans=
max(ans,a[i]
.v-a[i]
.s);
//找到最大的風險值
printf
("%d"
,ans)
;}
問題 a: 切繩子
描述有n條繩子,長度分別為l[i]。如果從他們中切割出k條長度相同的繩子的話,這k條繩子每條最長能有多長?(答案保留小數點後兩位(直接捨掉兩位後的小數),規定1單位長度的繩子最多可以切割成100份)
格式輸入格式
包含多組輸入
輸入n,k,(1<=n,k<=10000)
然後n行,輸入l[i],代表每一條繩子的長度(1<=l[i]<=100000)
輸出格式
切出k條長度相等的繩子最大長度是多少,輸出保留兩位小數
樣例樣例輸入 copy
4 11
8.02
7.43
4.57
5.39
樣例輸出 copy
2.00
這裡如果直接原樣輸入結果就會出錯。題目要求保留兩位小數,後面的可以捨去,也就是說最多能夠影響到結果的是第三位小數(第三位進製),在二分mid的時候(left+right)/2的時候看是否能進製,所以我們可以直接先將每個資料擴大一百倍。接下來就是求最大值的情況,就也是讓繩子數目盡量少,求繩子數目就讓每根繩子除以二分的mid然後將繩子數相加跟k進行比較。在這裡二分區間可以用[0,最長的繩子長度】右區間不選最短繩子是因為當繩子有多條,但k=1的時候繩子最長的情況就是可以不用切繩子,就是最長的那跟繩子。
下面看ac**
#include
double a[
10000+10
];int n,m;
void
sort
(int left,
int right)
} a[left]
=a[i]
; a[i]
=temp;
sort
(left,i-1)
;sort
(i+1
,right);}
intcheck
(int mid)
intmain()
sort(0
,n-1);
//用快排以防超時
/* for(i=0; il=0;
r=a[n-1]
;//二分區間是【0,最長的繩子長度】
while
(l<=r)
else
r=mid-1;
} ans/
=100
;//最後還原資料
printf
("%.2lf\n"
,ans);}
}
問題 b: 如何放牛
描述農夫有n個牛欄,m頭牛,然後要讓你把m個牛都放進牛欄裡,讓兩頭牛之前的最大的最小距離
格式輸入格式
多組輸入
輸入n,m (1<=m<=n<=100000)
下面n行是牛欄的位置xi (0 <= xi <= 1,000,000,000)
輸出格式
輸出兩頭牛最大的最小距離
樣例樣例輸入 copy
5 3128
49樣例輸出 copy
3fj可以將他的3頭奶牛放在位置1,4和8的攤位上,最小距離為3.
提取主幹,查詢最大值中的最小值
區間為【0,最大的那個值】,用每次的二分mid來和兩個牛欄之間的距離進行比較,如果mid比兩個牛欄小就說明可以放進去一頭牛,ans++,然後對第二個牛欄和第三個牛欄的距離與mid進行比較,看能否放入一頭牛,如果放不進去就要用第二個牛欄和第四個牛欄進行比較。最後用放入的牛數ans與m進行比較,因為是查詢最小值,所放入的牛ans#include
int a[
100000+10
],n,m;
void
sort
(int left,
int right)
} a[left]
=a[i]
; a[i]
=temp;
sort
(left,i-1)
;sort
(i+1
,right);}
intcheck
(int mid)}if
(ans//如果放入的牛數小於預期的m就說明二分的mid太大難以放入m頭牛
return1;
else
return0;
//說明放入的牛數大於等於m,說明mid太小或者剛剛符合
}int
main()
else
}printf
("%d\n"
,ans);}
}
產品思維學習筆記20210122
今天繼續來分享產品思維的學習感悟 用產品經理的視角來看人 結婚教練的故事。工作就是指導30多歲下定決心要結婚的女生,如何能夠在一年半之內搞定結婚 最重要的環節就是如何觀察和判斷乙個人。改變乙個人 那是非常非常難的事情。如何在開始之前就去相對完整的 有框架的去觀察乙個人 對這個人去進行適配的乙個判斷 ...
2021 01 22 打卡學習C 第二天
二 程式流程結構 2 switch語句 2 迴圈結構 3 跳轉語句 加 正號 減 負號 乘 除 取餘 前置 後置遞增 前置 後置遞減 示例 include using namespace std intmain 輸出結果 賦值 加等於 減等於 乘等於 除等於 模等於 示例 include using...
學習後總結,總結後再學習
學習後總結,總結後再學習 2010年畢業以來,讀了幾百本書籍,包括it技術 管理 歷史 營銷 金融 心理等等,在讀某商學院mba一年後感覺有些東西還是要寫寫,除了能增加自己對某些知識和理論的理解外,也許其他人也碰巧想關注一下,了解這方面的東西。我所寫的都是一些簡單的概念層面的解釋,不會做太深入的闡述...