标签:mem mes class define def c++ sub inf main
昨天和今天测了一下前年noip tg的题
100+80+20+60+45+0=305pts
应该是大众分了。。刚好压前年我省1=线。。
我还是太弱了/kk
提交的代码:
D1T1:
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=2e5; int n,a[N],b[N],f[N]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) b[i]=a[i]-a[i-1]; for(int i=1;i<=n;i++) { f[i]=f[i-1]; if(b[i]>0)f[i]+=b[i]; } printf("%d",f[n]); return 0; }
D1T2:
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=105; const int M=3e6+10; int T,n,a[N],dp[M],ans,mx,sum; void clear() { memset(dp,0,sizeof(dp)); dp[0]=1;ans=n;mx=0; } int main() { scanf("%d",&T); while(T--) { scanf("%d",&n);clear(); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); sum+=a[i]; } sort(a+1,a+n+1); for(int i=1;i<=n;i++) { if(dp[a[i]]){ans--;continue;} for(int j=a[i];j<=sum;j++) dp[j]|=dp[j-a[i]]; } printf("%d\n",ans); } return 0; }
D1T3:
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=5e5+10; int n,m,tot=0,vis[N],ans,id; int to[N],val[N],pre[N],now[N]; void add(int x,int y,int z) { pre[++tot]=now[x]; to[tot]=y,val[tot]=z; now[x]=tot; } void dfs(int x,int fk) { vis[x]=true; if(fk>=ans){id=x;ans=fk;} for(int i=now[x];i;i=pre[i]) { int y=to[i]; if(vis[y])continue; dfs(y,fk+val[i]); } } int main() { scanf("%d%d",&n,&m); for(int i=1,u,v,l;i<n;i++) { scanf("%d%d%d",&u,&v,&l); add(u,v,l);add(v,u,l); } dfs(1,0); memset(vis,0,sizeof(vis));ans=0; dfs(id,0); printf("%d",ans); return 0; }
看到T1后我们可以画个图:
我们把深度看成高度,分成了max{a[i]}层
很显然答案就是每一层被分开的区间数的总和
Subcode:
for(int h=1;h<=MaxA;h++) for(int i=1;i<=n;i++) if(a[i]>=h&&a[i]-1<h)ans++;
时间复杂度为O(n*max{a[i]});
标签:mem mes class define def c++ sub inf main
原文地址:https://www.cnblogs.com/Xxhdjr/p/13169455.html