今天排名一般,但是卻感覺不錯,也是可以的
7.29場鏈結
a題:
題意:01揹包問題,要求最優情況是重量和體積都最大的情況
解法:和之前的「勁歌金曲」那道題挺像的,就是設計乙個最優狀態,只有當這個狀態比當前狀態更優的時候我們才進行狀態轉移,狀態這個詞最為重要
注意壓縮完空間後的最終狀態所處的位置
#include
#include
#include
using
namespace
std;
int w[1005], v[1005];
typedef
long
long ll;
struct node
}dp[100005];
int main()
}printf("%d %d\n", dp[c].w, dp[c].v);
}return
0;}
d題:
題意:有n堆石子,每次要求把重量最小的兩堆進行合併,之後會有m個詢問,問第幾次操作完中某堆石子的序號
解法:
哈夫曼樹,並查集,因為當這個石子和其他石子合併的時候,他們就相當於屬於乙個集合了,那麼之後對集合中乙個元素的修改就相當於修改其所有的元素
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
intset[1000000];
int findset(int x)
void unionset(int x, int y)
}struct node
};priority_queue q;
queue
int, int>>ask;
int main() );//編號為i的稀泥的重量為tmp
set[i] = i;
}for (int i = 1; i <= m; i++)
int now = 0;
while (ask.size()&&q.size() > 1) );
now++;
while (ask.size()&&now == ask.front().first) }}
return
0;}
codeforces contest 1009
b題:
題意:給定乙個數列,這個數列裡面只有0,1,2,有兩種操作,將相鄰的01對換位置,將相鄰的12調換位置,2和0不能調換位置,每種操作可以變無數次,問經過多種這樣子的操作後字典序最小的序列是什麼樣子的。
解法:由於2和0的位置是不能調換的,所以我們就把所有的1單獨拿出來,然後再把所有的1放到第乙個2前面就行了,很好的思路題
#include
#include
#include
using
namespace
std;
char s[100000 + 5];
int main()
}for (int i = 0; i < len; i++)
if(pos==-1)for (int k = 0; k < num; k++)printf("1");
return
0;}
c題:
題意:給定乙個序列,每次給你兩個數,要求將序列裡面的每個數都加上x,之後選擇乙個位置j,將所有的數加上d*dist(i,j),問怎樣選擇j可以使得最後所有的數的平均數最大
解法:推一下公式就行了,要注意的是double的用法
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
int a[100000 + 5];
int main()
else ans += d*(n - (n + 1) / 2)*((n + 1) / 2);
}printf("%.15f\n", double(ans)/n);
return
0;}
7 29 修理牧場
7 29 修理牧場 題目大意,總長度l的木板,分為n塊,每塊ai長度。切割的酬勞等於被切木板長度。例如,要將長度為20的木頭鋸成長度為8 7和5的三段,第一次鋸木頭花費20,將木頭鋸成12和8 第二次鋸木頭花費12,將長度為12的木頭鋸成7和5,總花費為32。一開始想了個錯誤的方法,排序之後,遞迴的...
7 29 修理牧場
農夫要修理牧場的一段柵欄,他測量了柵欄,發現需要n塊木頭,每塊木頭長度為整數l i 個長度單位,於是他購買了一條很長的 能鋸成n塊的木頭,即該木頭的長度是l i 的總和。但是農夫自己沒有鋸子,請人鋸木的酬金跟這段木頭的長度成正比。為簡單起見,不妨就設酬金等於所鋸木頭的長度。例如,要將長度為20的木頭...
7 29物件導向
面向過程 所謂過程就是我們解決問題的步驟,一步步的按照流程走,有先後之分。它呢,整個設計就好比流水線,思維上比較機械化。優缺點 缺點 物件導向 核心是物件。正式的來說 通過資料和行為方式來描述互動物件的集合 在python 中一切皆為物件 物件導向的優缺點 缺點 在現實世界中,以我們為列 objec...