0%

LeetCode 857. Minimum Cost to Hire K Workers

Desc:

N个worker,每个worker有quality和wage,你需要雇佣K个worker,这K个worker之间的real wage比例和quality比例相同,且real wage不小于wage。
$$
1 \le K ,N \le 10000

1\le quality,wage\le10000
$$
答案允许有10^-5的误差

My_Ans:

冷静分析,首先 worker之间严格按照比例发real wage 且
$$
real wage[i]\ge wage[i]
$$
定义
$$
ratio[i]=wage[i]/quality[i]
$$
假设已经选出了K个worker,那么这个standard worker就需要设置为ratio最大的那个worker

否则会有worker的real wage<wage。

因此对于每个standard worker 我们需要找出k-1个ratio小于它的worker,而且K个worker的
$$
totalwage = ratio* \sum_{n=1}^K{quality}
$$
按照ratio对worker从小到大排序,枚举第i个worker作为standard worker

所以第0~第i-1个worker均为满足ratio满足要求的,然后需要找出K-1个quality最小的即可

阅读全文 »

不知不觉2018过去了

本来打算12.31写的 然而咕咕了

现在还打算继续咕咕

先写2019目标(笑

希望自己考研顺利

PT继续佛系刷

有钱组NAS

换个显示器

其他东西不要坏(瘫

阅读全文 »

还是比较简单的,但是这个跟我在宁夏坑队友的一个题一模一样,权当纪念吧

题目:实现一个数据结构,这个数据结构需要实现栈的插入,栈的弹出,返回栈顶元素,返回栈内最小值四种操作。

My Ans:用vector保存从栈底到栈顶的前缀Min,可以知道每次插入的时候需要在Vector中插入Min(input,Vector.back());

跑的不是很快…28ms beat 50.39%而已

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class MinStack {
public:
/** initialize your data structure here. */
vector<int>m;
stack<int>st;
MinStack() {
m.clear();
}
void push(int x) {
st.push(x);
if(m.empty()) m.push_back(x);
else m.push_back(min(m.back(),x));
}
void pop() {
m.pop_back();
st.pop();
}
int top() {
return st.top();
}
int getMin() {
return m.back();
}
};
阅读全文 »

最近的日子过得挺快的。

感觉有丶弱智,搭了OJ不知道用来干嘛

blog也算是小小的安全屋(?

R6打的比较多 其他游戏也都歇了 准备开始 数1 英1的复习

课程方面刚结束了数据结构 最后考试有一题不太会 其他都还行

JAVA就不提了..学院自己开的水课,基本也就学了SWING的一些基本框架应用 进程算是半懂不懂的情况

只能说还是犯懒

LeetCode 算是半摸鱼状态吧,到现在也就刷了一百个

明年得报个PAT,也算是留条后路

阅读全文 »

大模拟吧…细节蛮多的(这个题我发现全是踩所以写一篇…)

我是将字符串分割读入vector中 然后去掉vector中的末尾0

按照比较字典序大小的方法逐个比较vector中的元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public:
vector<int> div(string s){
int ss=s.size();
vector<int>ans;
for(int i=0;i<ss;){
if(isdigit(s[i])){
int cnt=0;
while(isdigit(s[i])){
cnt=cnt*10+s[i]-'0';
i++;
}
if(cnt!=0)ans.push_back(cnt);
}
else i++;
}
return ans;
}
int compareVersion(string version1, string version2) {
vector<int>v1=div(version1);
vector<int>v2=div(version2);
for(int i=0;i<min(v1.size(),v2.size());i++){
if(v1[i]>v2[i]) return 1;
else if(v1[i]<v2[i]) return -1;
}
if(v1.size()>v2.size()) return 1;
else if(v2.size()>v1.size()) return -1;
return 0;
}
};
阅读全文 »

已经几乎退役了就只能做做LeetCode维持生活

记录一下自己的刷题记录.

Solved Question:31-66-68

Easy: 10-23-23-32

Medium:14-30-30-41

Hard:7-13-15-17

不知道能不能保持住一天2-3个medium以上题的频率(flag已经收了 没有

老年化不可避

阅读全文 »

垃圾校园网(划掉)

4M IPV4出口限速 50M IPV6出口限制(局域网内不限速)

PS:有很多高校有IPV6的PT,上面有肥肠多的资源,例如

https://npupt.com

https://www.tjupt.org/

除此之外 我们就可以用IPV6来加速一下日常应用(不包括QQ等小流量需求软件,其实就是主要面向各类gamer)

首先确保你的设备有IPV6网络(直连网线使用客户端or拨号上网,路由器配置好了NAT6,至于路由器怎么配NAT6随便百度一下应该都有,有需要可以留言迟点会补)

test-ipv6.com 达到9分以上

访问谷歌和油管可以直接修改hosts达成,一般情况下比较快,但是受限于hosts的新旧程度

阅读全文 »

题意:要求查询(u,v)之间路径点权第K小

考虑如何用加减法构造出只包含u->v路径点的权值线段树

我们可以考虑以根作为前缀,建立从根至叶子结点的主席树。

很容易知道(u,v)路径点的权值线段树==sum[u]+sum[v]-sum[ lca(u,v)]-sum[ fa[ lca(u,v) ] ];

(我不会告诉你我一开始眼瞎看成了边权第K小然后看这个式子怎么看都和别人的不一样)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
inline int read(){
int x=0,f=1;char ch = getchar();
while('0'>ch||ch>'9'){if('-'==ch)f=-1;ch=getchar();}
while('0'<=ch&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
using namespace std;
const int N=100000+10;

//head end

int n,m,w[N],b[N];

struct node{
int to,next;
}G[N<<1];
int head[N],tot;


// chairTree begin
const int MN=100000+10;
int rt[MN],ls[MN*20],rs[MN*20],sum[MN*20],chairtree,siz;

void build(int &rt,int l,int r){
rt=++chairtree;
sum[rt]=0;
if(l>=r)return ;
int m =((r-l)>>1)+l;
build(ls[rt],l,m);
build(rs[rt],m+1,r);
}

void update(int& rt,int l,int r,int last,int pos){
rt=++chairtree;
ls[rt]=ls[last];
rs[rt]=rs[last];
sum[rt]=sum[last]+1;

if(l>=r) return ;
int m=((r-l)>>1)+l;
if(pos<=m) update(ls[rt],l ,m,ls[last],pos);
else update(rs[rt],m+1,r,rs[last],pos);
}

int query(int rt,int l,int r,int last,int lca,int flca,int k){
if(l>=r) return l;
int m=((r-l)>>1)+l;
int cnt=sum[ls[rt]]+sum[ls[last]]-sum[ls[lca]]-sum[ls[flca]];
if(k<=cnt) query(ls[rt],l ,m,ls[last],ls[lca],ls[flca],k);
else query(rs[rt],m+1,r,rs[last],rs[lca],rs[flca],k-cnt);
}

void dfs(int rt,int l,int r){
int m = ((r-l)>>1)+l;
printf("%d",sum[rt]);
if(l>=r) return ;printf("( ");
dfs(ls[rt],l,m);printf("_%*d,",2,ls[rt]);
dfs(rs[rt],m+1,r);printf("_%*d )",2,rs[rt]);
}

//chairTree end

void add(int u,int v){
G[++tot].to=v,G[tot].next=head[u],head[u]=tot;
G[++tot].to=u,G[tot].next=head[v],head[v]=tot;
}

int dep[N],fa[N],sz[N],son[N];
void dfs1(int u,int f,int d){
dep[u]=d,fa[u]=f,sz[u]=1,son[u]=0;
for(int i=head[u],to;i;i=G[i].next){
to=G[i].to;
if(to==f)continue;
dfs1(to,u,d+1);
sz[u]+=sz[to];
if(sz[son[u]]<sz[to])son[u]=to;
}
}

int tree[N],top[N],pre[N],cnt;
void dfs2(int u,int tp){
top[u]=tp,tree[u]=++cnt,pre[tree[u]]=u;
update(rt[u],1,siz,rt[fa[u]],w[u]);
if(!son[u])return;
dfs2(son[u],tp);
for(int i=head[u],to;i;i=G[i].next){
to=G[i].to;
if(to==fa[u]||to==son[u])continue;
dfs2(to,to);
}
}

int Lca(int x,int y){
int fx=top[x],fy=top[y];
while(fx!=fy){
if(dep[fx]<dep[fy])swap(x,y),swap(fx,fy);
x=fa[fx],fx=top[x];
}
if(dep[x]>dep[y])swap(x,y);
return x;
}

int main(){
#ifndef ONLINE_JUDGE
freopen("D:\\GitHub\\ACM-ICPC\\other\\in.txt","r",stdin);
#endif
n=read(),m=read();
for(int i=1;i<=n;i++) w[i]=read(),b[i]=w[i];
for(int i=1;i< n;i++) add(read(),read());
fa[1]=0;
sort(b+1,b+n+1);
siz = unique(b+1,b+n+1)-(b+1);
for(int i=1;i<=n;i++) w[i]=lower_bound(b+1,b+siz+1,w[i])-b;
build(rt[0],1,siz);
//dfs(rt[0],1,siz);
dfs1(1,0,1),dfs2(1,1);
while(m--){
int u,v,k;
u=read(),v=read(),k=read();
int lca=Lca(u,v);
printf("%d\n",(b[query(rt[u],1,siz,rt[v],rt[lca],rt[fa[lca]],k)]));
}
#ifndef ONLINE_JUDGE
printf("My Time:%.3lfms\n",(double)clock()/CLOCKS_PER_SEC);
#endif
}
阅读全文 »