20170715


T1:

Alice 和 Bob 有一個長度爲2n的數。現在他們要在這個數字上玩遊戲。他們分別要從 2n 個位中取出 n 個位組成自己的幸運值。每一回合,Alice 或 Bob 把數字最左邊的那一位拿來放在自己幸運值

的最末位。在第 i 輪操作過後,被選取的數位(原數的第i位)會從原數中消失。現在 Alice 和 Bob 想要使得他們兩個幸運值的和儘可能大。請求出這個值。

自己想的選數: 

每次在可選的範圍內選擇最大的數

#include<bits/stdc++.h>
using namespace std;

int a[50],n,w=0,pos,tot;
bool ex[50];
long long ans=0;

inline void work(){
	ans=ans*10;
	++w;
	for(int i=1;i<=n*2;++i){
		if(ex[i]==false){
			ans+=a[i];
			ex[i]=true;
			break;
		}
	}
	int maxn=-1;
	for(int i=1;i<=n*2;++i){
		if(2*n-i>=n-w&&i>=pos){
			if(ex[i]==false&&a[i]>maxn)
			maxn=a[i];
		}
	}
	for(int i=1;i<=n*2;++i){
		if(2*n-i>=n-w&&i>=pos){
			if(a[i]==maxn&&ex[i]==false){
				ex[i]=true;
				ans+=a[i];
				pos=i;
				break;
			}
		}
	}
	if(w==n) return;
	work();
}

int main(){
//	freopen("hello.in","r",stdin);
//	freopen("hello.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=2*n;++i) scanf("%1d",&a[i]);
	work();
	cout<<ans;
	return 0;
}

標算:

動態規劃 f[i][j]:當前位置選擇i個數到第一個數中,選擇i個數到第二個數中,f[i][j]=兩數之和。

#include<bits/stdc++.h>
using namespace std;
int n;
int a[50];
long long f[20][20],s[50];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=2*n;++i) scanf("%1d",&a[i]);
	s[n]=1;
	for(int i=n-1;i>=1;--i) s[i]=s[i+1]*10;
	for(int i=1;i<=n;++i) f[i][0]=f[i-1][0]+a[i]*s[i],f[0][i]=f[i][0];
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
			f[i][j]=max(f[i-1][j]+a[i+j]*s[i],f[i][j-1]+a[i+j]*s[j]);
	cout<<f[n][n];
	return 0;
}



發佈了20 篇原創文章 · 獲贊 4 · 訪問量 2104
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章