https://www.zhixincode.com/contest/7/problems
A题
解析 分类讨论
#include<bits/stdc++.h> #define all(a) (a).begin(),(a).end() using namespace std; typedef unsigned long long ull; const int maxn=2e6+10; int n,r,m,k,s; int main() { scanf("%d%d%d%d%d",&n,&r,&m,&k,&s); vector<int> x,y,zhuan{1,n}; for(int i=0;i<r;i++) { int a,b; scanf("%d%d",&a,&b); if(a==s&&b==0) continue; if(b==0) x.push_back(a); else y.push_back(a); } sort(all(x));sort(all(y)); while(m--) { int c; scanf("%d",&c); zhuan.push_back(c); } sort(all(zhuan)); if(y.size()>0) { int l,r; if(x.size()==0) r=*(--y.end()),l=*y.begin(); else { r=max(*(--x.end()),*(--y.end())); l=min(*x.begin(),*y.begin()); } int ans1; for(auto it:zhuan) if(it<=l)ans1=it; int ans2=zhuan[lower_bound(all(zhuan),r)-zhuan.begin()]; //cout<<ans1<<" "<<ans2<<endl; int ans=(ans2-ans1+k)*2; if(s<ans1) ans+=(ans1-s)*2; else if(s>ans2) ans+=(s-ans2)*2; cout<<ans<<endl; return 0; } x.push_back(s); sort(all(x)); if(x.size()==1&&x[0]==s) cout<<0<<endl; else if(x[0]==s) { int ans=zhuan[lower_bound(all(zhuan),*(--x.end()))-zhuan.begin()]; cout<<(ans-s)*2<<endl; } else if(*(--x.end())==s) { int ans; for(auto it:zhuan) if(it<=x[0]) ans=it; cout<<(s-ans)*2<<endl; } else { int ans1,ans2; for(auto it:zhuan) if(it<=x[0])ans1=it; ans2=zhuan[lower_bound(all(zhuan),*(--x.end()))-zhuan.begin()]; cout<<(ans2-ans1)*2<<endl; } }
B题
dp
#include<bits/stdc++.h> #define all(a) (a).begin(),(a).end() using namespace std; typedef unsigned long long ull; const int maxn=10200; int mp[20][20],dp[20][20][maxn]; int main() { int n,m,C,xs,xt,ys,yt; scanf("%d%d%d",&n,&m,&C); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&mp[i][j]); scanf("%d%d%d%d",&xs,&ys,&xt,&yt); memset(dp,-0x3f,sizeof(dp)); dp[xs][ys][0]=0; for(int k=1;k<maxn;k++) { for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { dp[i][j][k]=max({dp[i-1][j][k-1],dp[i][j+1][k-1],dp[i+1][j][k-1],dp[i][j-1][k-1],dp[i][j][k-1]})+(k%mp[i][j]==0?1:0); } } } int ans=-1; for(int i=0;i<maxn;i++) { if(dp[xt][yt][i]>=C) { ans=i; break; } } printf("%d\n",ans); }
E题 树形dp
#include <bits/stdc++.h> #define pb push_back #define mp make_pair #define fi first #define se second #define all(a) (a).begin(), (a).end() #define fillchar(a, x) memset(a, x, sizeof(a)) #define huan printf("\n") #define debug(a,b) cout<<a<<" "<<b<<" "<<endl #define ffread(a) fastIO::read(a) using namespace std; typedef long long ll; const int maxn = 1e5+10; const int maxm = 1e4+10; const int inf = 0x3f3f3f3f; const ll mod = 998244353; const double epx = 1e-6; const double pi = acos(-1.0); //head------------------------------------------------------------------ struct edge { int to,next; }e[maxn]; int head[maxn],tot; int dp[maxn][2],vis[maxn],f[maxn],d[maxn],n; void init() { tot=0; fillchar(head,-1); fillchar(vis,0); } void add(int u,int v) { e[tot].to=v; e[tot].next=head[u]; head[u]=tot++; } void dfs(int x,int y) { vis[x]=1; dp[x][0]=0; dp[x][1]=f[x]; for(int i=head[x];i!=-1;i=e[i].next) { int v=e[i].to; if(v==y) continue; dfs(v,x); dp[x][0]+=max(dp[v][0],dp[v][1]); dp[x][1]+=max(dp[v][0],dp[v][1]-d[min(x,v)]); } } int main() { init(); cin>>n; for(int i=1;i<=n;i++) cin>>f[i]; for(int i=1;i<=n;i++) cin>>d[i]; for(int i=2;i<=n;i++) { if(i%2==0) add(i/2,i),add(i,i/2); else if(3*i+1<=n) add(3*i+1,i),add(i,3*i+1); } int ans=0; for(int i=1;i<=n;i++) if(!vis[i]) { dfs(i,-1); ans+=max(dp[i][1],dp[i][0]); } cout<<ans<<endl; }
F最短路
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<bitset> #include<cassert> #include<cctype> #include<cmath> #include<cstdlib> #include<ctime> #include<deque> #include<iomanip> #include<list> #include<map> #include<queue> #include<set> #include<stack> #include<vector> using namespace std; typedef long long ll; typedef long double ld; typedef pair<int,int> pii; const double PI=acos(-1.0); const double eps=1e-6; const ll mod=1e9+7; const int inf=0x3f3f3f3f; const int maxn=1e5+10; const int maxm=100+10; #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int n,m,k; int cnt=0,head[maxn<<2]; bool vist[maxn]; ll dis[maxn],body[maxn]; priority_queue<pair<ll,int>,vector<pair<ll,int> >,greater<pair<ll,int> > >q; struct node{ int v,nex; ll w; }edge[maxn<<2]; void add(int u,int v,ll w) { edge[cnt].v=v; edge[cnt].w=w; edge[cnt].nex=head[u]; head[u]=cnt++; } void dijkstra(int s) { dis[s]=0;//到自己的最短距离直接设为0 q.push(make_pair(0,s)); while(!q.empty()){//队列非空 int u=q.top().second;q.pop(); vist[u]=true; for(int i=head[u];~i;i=edge[i].nex){ int v=edge[i].v; ll w=edge[i].w+(body[v]>k?(body[v]-k)*(body[v]-k):0); if(dis[v]>dis[u]+w){//满足条件更新距离 dis[v]=dis[u]+w; //p[v]=u;//保存路径 q.push(make_pair(dis[v],v));//把更新完的值压入队列 } } } } int main() { memset(head,-1,sizeof(head));//初始化数组 memset(vist,false,sizeof(vist)); //memset(dis,inf,sizeof(dis)); cin>>n>>m>>k; for(int i=0;i<=n;i++)//把距离初始化为 inf 不能用memset 自己估算一下路径最长有多长 inf定义大一点就好 dis[i]=1e18; for(int i=1;i<=n;i++) cin>>body[i]; for(int i=1;i<=m;i++){ int u,v;ll w; cin>>u>>v>>w; add(u,v,w); add(v,u,w);//无向图相互可达 有向图一次就好 } k+=body[1]; dijkstra(1); cout<<dis[n]<<endl;