34pts求调(代码有注释
查看原帖
34pts求调(代码有注释
610758
2009cqr楼主2024/10/19 17:52
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <deque>
#include <map>
#include <iomanip>
#include <iostream>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
#define LF putchar('\n')
#define SP putchar(' ')
#define rep(i,a,b) for(register int i=(a);i<=(b);++i)
#define repp(i,a,b) for(register int i=(a);i>=(b);i--)
#define pill pair<int,int>
#define mem(t, v) memset((t),v,sizeof(t))
#define fir first
#define sec second
#define mk make_pair
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define lc root<<1
#define rc root<<1|1
typedef long long ll;
typedef unsigned long long ull;
template<typename T>
void read(T &x) {x=0;char ch=getchar();ll f=1;while(!isdigit(ch)){if(ch=='-')f*=-1;ch=getchar();}while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}x*=f;}
template<typename T, typename... Args>
void read(T &first, Args& ... args) {read(first);read(args...);}
template<typename T>
void write(T arg) {T x=arg;if(x<0) {putchar('-');x=-x;}if(x>9) {write(x/10);}putchar(x%10+'0');}
template<typename T, typename ... Ts>
void write(T arg, Ts ... args) {write(arg);if(sizeof...(args)!=0) {putchar(' ');write(args ...);}}
const ll mod=10007,N=1e5+10,M=1e5+10;
//挑选数位组合在一起删除时此时花费与单独删除差值最大
ll c,t,v[20],maxx,coast;
struct node{
	ll num,v;
}dp[N][10];
string s; 
signed main(){
//	freopen("bargain.in","r",stdin);
//	freopen("bargain.ans","w",stdout);
	cin>>c>>t;
	while(t--){
		maxx=coast=0;
		dp[0][0]=dp[1][0]=dp[0][1]=(node){0,0};
		cin>>s;
		rep(i,1,9)cin>>v[i];
//		rep(i,1,9)cout<<v[i]<<" ";
		int len=s.size();
		s=" "+s;		
		rep(i,1,len){
			int num=s[i]-'0';
			coast+=v[num];
			rep(j,1,7){
				if(j>i)break;
				dp[i][j]=(node){0,0}; 
				ll sum=dp[i-1][j-1].num*10+num,csum=dp[i-1][j-1].v+v[num];
				if(csum-sum==dp[i-1][j].v-dp[i-1][j].num and sum<dp[i-1][j].num)dp[i][j]=(node){sum,csum};
				else if(csum-sum>dp[i-1][j].v-dp[i-1][j].num)dp[i][j]=(node){sum,csum};
				else dp[i][j]=dp[i-1][j];
				maxx=max(maxx,dp[i][j].v-dp[i][j].num);
			}
		}
		cout<<coast-maxx<<"\n";
	}
//	fclose(stdin);
//	fclose(stdout);
	return 0;
}

过不了第二个大样例,求大神帮忙,ORZ

2024/10/19 17:52
加载中...