1. 程式人生 > >C Collect Jewel && G- Get the Highest Score

C Collect Jewel && G- Get the Highest Score

 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;
}