2018.9.15 ACM-ICPC 2018 焦作赛区网络预赛
A.Magic Mirror(过)
https://nanti.jisuanke.com/t/31710
签到题,将输入的字符串转换成大写再与给定字符串比较即可
B.Mathematical Curse(过)
https://nanti.jisuanke.com/t/31711
题意:给定原始整数K,给定长为N的非零整数串,再给定M个计算符,求用完M个计算符后最大的结果
思路:
动态规划
用两个二维数组g,h分别保存当前最大和最小的结果,从前往后枚举整数和计算符;
状态转移方程为:g(i,j)=max(g(i,j),g(i-1,j-1)f(j)a(i),h(i-1,j-1)f(j)a(i))
h(i,j)=max(h(i,j),h(i-1,j-1)f(j)a(i),g(i-1,j-1)f(j)a(i))
初始条件为g(0,0)=h(0,0)=k 答案为g(n,m)
#include<iostream>
#include<cstring>
#include<cstdio>
#define LL long long
#define INF 10000000000000000
using namespace std;
int n,m;
LL k,a[1005]={0};
LL g[1005][10],h[1005][10];
string s;
void Init()
{
scanf("%d%d%lld",&n,&m,&k);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
cin>>s;
s=" "+s;
}
LL Cal(LL a,char c,LL b)
{
if(c=='+')return a+b;
if(c=='-')return a-b;
if(c=='*')return a*b;
if(c=='/')return a/b;
}
LL Max(LL a,LL b)
{
if(a>b)return a;
return b;
}
LL Min(LL a,LL b)
{
if(a<b)return a;
return b;
}
void Solve()
{
//初始化
//memset(g,0,sizeof(g));
//memset(h,0,sizeof(h));
for(int i=0;i<=n;i++)
for(int j=0;j<s.length();j++)
{
g[i][j]=-INF;
h[i][j]=INF;
}
g[0][0]=h[0][0]=k;
//动规
int Len=s.length()-1;
for(int i=1;i<=n;i++)
for(int j=0;j<=Len;j++)
{
g[i][j]=-INF;
h[i][j]=INF;
if(j>i)continue;
if(i>j)g[i][j]=g[i-1][j];
if(j>0)
{
g[i][j]=Max(g[i][j],Cal(g[i-1][j-1],s[j],a[i]));
g[i][j]=Max(g[i][j],Cal(h[i-1][j-1],s[j],a[i]));
}
h[i][j]=h[i-1][j];
if(j>0)
{
h[i][j]=Min(h[i][j],Cal(h[i-1][j-1],s[j],a[i]));
h[i][j]=Min(h[i][j],Cal(g[i-1][j-1],s[j],a[i]));
}
//printf("%d**%d**%lld**%lld\n",i,j,g[i][j],h[i][j]);
}
printf("%lld\n",g[n][Len]);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
Init();
Solve();
}
return 0;
}
/*
1
5 4 833
712 -543 347 -135 -33
-/*+
*/
注意:1.最多五个运算符,每个数绝对值最大为1000,应取无限大为10^15 ++
2.数组开大一点,不要抵着上限开
3.要注意合法状态不能由多余的非法状态转移得来
D.Sequence(未过)
https://nanti.jisuanke.com/t/31713
题意:设长度为M,每个位置最大数为N的数串中每个数字最大的出现次数为x,求x的期望
F.Modular Production Line(未过)
https://nanti.jisuanke.com/t/31715
题意:给出一定数目的区间,每个区间有个权值,求在覆盖次数不超过k的情况下,总权和的最大值
思路:费用流