码迷,mamicode.com
首页 > 其他好文 > 详细

校内模拟考 (一)

时间:2019-05-19 23:31:11      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:for   影响   open   ace   int   答案   double   +=   void   

一个裸裸的树形DP

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e5+5;
 4 int n,t,tot,s,a[N],h[N];
 5 int cnt,fro[N],to[N],nxt[N];
 6 inline int read() {
 7     int x=0; char c=getchar();
 8     while(c<0||c>9) c=getchar();
 9     while(c>=0&&c<=9) x=(x<<3)+(x<<1)+c-0,c=getchar();
10     return x;
11 }
12 void add(int x,int y) {
13     to[++cnt]=y,nxt[cnt]=fro[x]; fro[x]=cnt;
14 }
15 
16 void DP(int u) {
17     if(fro[u]==0) {a[u]=1; return ;}
18     for(int i=fro[u];i;i=nxt[i]) DP(to[i]);
19     tot=0; memset(h,0,sizeof(h));
20     for(int i=fro[u];i;i=nxt[i]) h[++tot]=a[to[i]];
21     sort(h+1,h+tot+1);
22     for(int j=1;j<=ceil((double)tot*t/100);j++) a[u]+=h[j];
23 }
24 
25 int main() {
26 //  freopen("pa.in","r",stdin);
27 //  freopen("pa.out","w",stdout);
28     n=read(),t=read();
29     for(int i=1;i<=n;i++) {
30         int x=read();
31         add(x,i);
32     }
33     DP(0); printf("%d",a[0]);
34 }

 

第二题

理一理思路

1)将人按身高从矮到高排序,按这个顺序处理时无论当前怎么放,都不会对后面更高的产生影响。

2)线段树:表示当前答案序列

校内模拟考 (一)

标签:for   影响   open   ace   int   答案   double   +=   void   

原文地址:https://www.cnblogs.com/qq8260573/p/10891353.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!