#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define ll long long
using namespace std;
inline int read(){
int x=0,o=1;char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')o=-1,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*o;
}
int main(){
int n=read(),ans=read(),last=ans;
for(int i=2;i<=n;++i){
int x=read();
if(x>last)ans+=x-last;
last=x;
}
printf("%d\n",ans);
return 0;
}
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define ll long long
using namespace std;
inline int read(){
int x=0,o=1;char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')o=-1,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*o;
}
const int N=105;
const int M=25005;
int a[N],f[M];
int main(){
int T=read();
while(T--){
int n=read();
for(int i=1;i<=n;++i)a[i]=read();
sort(a+1,a+n+1);int ans=n;
memset(f,0,sizeof(f));f[0]=1;
for(int i=1;i<=n;++i){
if(f[a[i]])--ans;
for(int j=a[i];j<=25000;++j)f[j]|=f[j-a[i]];
}
printf("%d\n",ans);
}
return 0;
}
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define rg register
#define ll long long
#define IT multiset<int>::iterator
using namespace std;
inline int read(){
rg int x=0,o=1;char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')o=-1,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*o;
}
const int N=50005;
int n,m,maxn,sum,dis[N],he[N];
int tot,head[N],nxt[N<<1],to[N<<1],w[N<<1];
inline void add(rg int a,rg int b,rg int c){nxt[++tot]=head[a];head[a]=tot;to[tot]=b;w[tot]=c;}
inline void dfs1(rg int u,rg int fa){
for(int i=head[u];i;i=nxt[i]){
int v=to[i];if(v==fa)continue;
dis[v]=dis[u]+w[i];dfs1(v,u);
}
}
inline bool check2(rg int mid){
dfs1(1,0);rg int last=0,cnt=0;
for(rg int i=1;i<=n;++i){
if(dis[i]-dis[last]>=mid){
++cnt;last=i;
}
}
return cnt>=m;
}
multiset<int>s[N];
inline int dfs(rg int u,rg int fa,rg int mid){
s[u].clear();
for(int i=head[u];i;i=nxt[i]){
rg int v=to[i];if(v==fa)continue;
rg int val=dfs(v,u,mid)+w[i];
if(val>=mid)++sum;如果能单独构成一条路径,就自己去玩
if(val<mid)s[u].insert(val);//如果不能就插入multiset中
}
rg int maxx=0;
while(s[u].size()){
if(s[u].size()==1)return max(maxx,(*s[u].begin()));
rg IT it=s[u].lower_bound(mid-*s[u].begin());
if(it==s[u].begin()&&s[u].count(*it)==1)++it;
if(it==s[u].end()){
maxx=max(maxx,*s[u].begin());
s[u].erase(*s[u].begin());
}
else{
++sum;
s[u].erase(s[u].find(*s[u].begin()));
s[u].erase(s[u].find(*it));
}
}
return maxx;
}
inline bool check(rg int mid){sum=0;dfs(1,0,mid);return sum>=m;}
int main(){
n=read();m=read();rg int bj1=1,bj2=1;
for(rg int i=1;i<n;++i){
rg int a=read(),b=read(),c=read();
add(a,b,c);add(b,a,c);maxn+=c;he[i]=c;
if(a!=1)bj1=0;if(b!=a+1)bj2=0;
}
if(m==1){//只用找一条最长的路,那么就是求树的直径
dfs1(1,0);rg int maxx=0,pos=1;
for(rg int i=1;i<=n;++i)if(dis[i]>maxx)maxx=dis[i],pos=i;
dis[pos]=0;dfs1(pos,0);maxx=0;for(rg int i=1;i<=n;++i)maxx=max(maxx,dis[i]);
printf("%d\n",maxx);return 0;
}
if(bj1){//以节点1为中心的菊花图,2m条边中,最小的边配最大的边即可,少了先补上边权为0的边.
rg int sum=n-1,minn=1<<30;
while(sum<2*m)he[++sum]=0;
sort(he+1,he+sum+1);
for(rg int i=sum-2*m+1;i<=sum-m;++i)
minn=min(minn,he[i]+he[2*sum-2*m+1-i]);
printf("%d\n",minn);return 0;
}
if(bj2){//一条链的情况,就相当于一个序列,让你去划分成m段,二分答案的模板题?
rg int l=0,r=maxn,Ans,mid;
while(l<=r){
mid=(l+r)>>1;
if(check2(mid))Ans=mid,l=mid+1;
else r=mid-1;
}
printf("%d\n",Ans);return 0;
}
rg int l=0,r=maxn,Ans,mid;
while(l<=r){//正解
mid=(l+r)>>1;
if(check(mid))Ans=mid,l=mid+1;
else r=mid-1;
}
printf("%d\n",Ans);return 0;
}
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define rg register
using namespace std;
inline int read(){
rg int x=0,o=1;char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')o=-1,ch=getchar();
while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x*o;
}
const int N=5005;
int n,m,now,visit[N],he[N],ans[N];
int tim,cnt,dfn[N],cir[N],fa[N];
vector<int>g[N];
inline void dfs(rg int u){
for(rg int i=0;i<(int)g[u].size();++i){
rg int v=g[u][i];if(visit[v])continue;
visit[v]=1;printf(" %d",v);dfs(v);
}
}
inline void DFS(rg int u,rg int del1,rg int del2){
for(rg int i=0;i<(int)g[u].size();++i){
rg int v=g[u][i];
if(visit[v])continue;
if((u==del1&&v==del2)||(u==del2&&v==del1))continue;
visit[v]=1;he[++now]=v;DFS(g[u][i],del1,del2);
}
}
inline bool check(){
for(rg int i=1;i<=n;++i)
if(he[i]^ans[i])return ans[i]>he[i];
return 0;
}
inline void dfs_circle(int u,int father){
dfn[u]=++tim;fa[u]=father;
for(int i=0;i<(int)g[u].size();++i){
int v=g[u][i];
if(!dfn[v])dfs_circle(v,u);
else if(dfn[v]>dfn[u]){
for(int now=v;now!=u;now=fa[now])cir[++cnt]=now;
cir[++cnt]=u;
}
}
}
int main(){
n=read();m=read();
for(rg int i=1;i<=m;++i){
rg int a=read(),b=read();
g[a].push_back(b);g[b].push_back(a);
}
for(rg int i=1;i<=n;++i)
if((int)g[i].size())sort(g[i].begin(),g[i].end());
if(m==n-1){
visit[1]=1;printf("1");
dfs(1);printf("\n");return 0;
}
if(m==n){
dfs_circle(1,0);
for(rg int i=1;i<=n;++i)ans[i]=n+1;
for(rg int i=1;i<cnt;++i){
for(rg int j=1;j<=n;++j)visit[j]=he[j]=0;
he[1]=1;visit[1]=1;now=1;DFS(1,cir[i],cir[i+1]);
if(now<n)continue;
if(check())for(rg int j=1;j<=n;++j)ans[j]=he[j];
}
for(rg int i=1;i<n;++i)printf("%d ",ans[i]);
printf("%d\n",ans[n]);
}
return 0;
}
原文:https://www.cnblogs.com/PPXppx/p/11762000.html