C Collect Jewel && G- Get the Highest Score
阿新 • • 發佈:2019-02-19
C Collect Jewel :
#include <iostream> #include <stdio.h> #include <math.h> #include <string.h> #include <algorithm> #include <queue> #include <vector> using namespace std; #define LL long long const int maxn = 3e2+22; const int inf = 0x3f3f3f3f; struct edge { int from,to,cap,flow,cost; edge(int u,int v,int c,int l,int co): from(u),to(v),cap(c),flow(l),cost(co){}; }; vector<int>G[maxn]; vector<edge>len; int n,m; int s,t; void add(int u,int v,int c,int cost) { len.push_back(edge(u,v,c,0,cost)); len.push_back(edge(v,u,0,0,-cost)); G[u].push_back(len.size()-2); G[v].push_back(len.size()-1); } int cost; void init() { cost=0; for(int i=0;i<maxn;i++){ G[i].clear(); } len.clear(); } int dis[maxn],pre[maxn]; int inq[maxn]; bool spfa() { queue<int>q; for(int i=0;i<=t;i++) dis[i]=inf,pre[i]=0; dis[s]=0; inq[s]=1;q.push(s); int a=inf; while(!q.empty()){ int u=q.front(); q.pop();inq[u]=0; for(int i=0;i<G[u].size();i++){ edge e=len[G[u][i]]; if(e.cap>e.flow&&dis[e.to]>dis[u]+e.cost){ dis[e.to]=dis[u]+e.cost; pre[e.to]=G[u][i]; a=min(a,e.cap-e.flow); if(!inq[e.to]){ inq[e.to]=1; q.push(e.to); } } } } if(dis[t]==inf) return 0; int u=t; cost+=dis[t]*a; while(u!=s){ len[pre[u]].flow+=a; len[pre[u]^1].flow-=a; u=len[pre[u]].from; } return 1; } void mincost() { while(spfa()){ continue; } } int main() { //源點0。 拆點2i-1,2i. 匯點 2*n+1, 答案點 2*n+2; init(); int T; scanf("%d",&T); int k; int cas=0; while(T--){ scanf("%d %d %d",&n,&m,&k); init(); // add(int u,int v,int cap,int cost) for(int i=1;i<=n;i++){ int x;scanf("%d",&x); add(2*i-1,2*i,1,-x); add(2*i-1,2*i,inf,0); } s=0,t=2*n+2; for(int i=1;i<=m;i++){ int u,v,c; scanf("%d %d %d",&u,&v,&c); add(2*u,2*v-1,inf,c); } for(int i=1;i<=n;i++){ add(0,2*i-1,1,0); add(2*i,2*n+1,1,0); } add(2*n+1,t,k,0); mincost(); printf("Case #%d: %d\n",++cas,abs(cost)); } return 0; }
G - Get the Highest Score:
#include <iostream> #include <stdio.h> #include <math.h> #include <string.h> #include <algorithm> #include <queue> #include <vector> using namespace std; #define LL long long const int maxn = 1e5+55; LL dp[maxn]; struct node { int len,val; }a[maxn]; LL sq(int a) { return 1LL*a*a; } int main() { int T; scanf("%d",&T); int cas=0; while(T--){ int n;scanf("%d",&n); int temp=1; scanf("%d",&a[1].val); a[1].len=1; for(int i=1;i<n;i++){ int x;scanf("%d",&x); if(x==a[temp].val){ a[temp].len++; }else{ a[++temp].val=x; a[temp].len=1; } } if(temp==1){ printf("Case #%d: %lld\n",++cas,sq(a[1].len)); continue; } for(int i=1;i<=temp;i++){ if(i==1&&a[1].val==-1) a[1].val=a[2].val; if(i==temp&&a[i].val==-1) a[i].val=a[i-1].val; if(a[i-1].val==a[i+1].val&&a[i].val==-1){ a[i].val=a[i-1].val; } } int tmp=1; for(int i=2;i<=temp;i++){ if(a[i].val==a[tmp].val){ a[tmp].len+=a[i].len; }else{ tmp++; a[tmp]=a[i]; } } dp[0]=0; for(int i=1;i<=tmp;i++){ dp[i]=dp[i-1]+sq(a[i].len); if(a[i].val==-1||a[i-1].val==-1){ dp[i]=max(dp[i],dp[i-2]+sq(a[i-1].len+a[i].len)); } if(a[i].val==-1&&a[i-2].val==-1){ dp[i]=max(dp[i],dp[i-3]+sq(a[i-2].len+a[i-1].len+a[i].len)); } } printf("Case #%d: %lld\n",++cas,dp[tmp]); } return 0; }