标签: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