链接:https://ac.nowcoder.com/acm/contest/9854/B
题目
思路
牛客的跨年场没能参加上,主要是20个小时的火车折磨再加上2小时的晕车使得本就劳累不堪的我雪上加霜,整个人是崩溃的。
dp问题,具体步骤见代码,伊丽莎白!
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+500;
int a[maxn],b[maxn];
bool dp[maxn][105]; //dp[i][j]:在考虑到第i个数字之后值是否会出现j
int main()
{
int n,y;
cin>>n>>y;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
cin>>b[i];
memset(dp, false, sizeof(dp));
dp[0][0]=true;
for(int i=1;i<=n;i++)
for(int j=0;j<y;j++)
if(dp[i-1][j]) //如果j数字可以被之前已纳入的数字实现
{
dp[i][(j+a[i])%y]=true;
dp[i][(j+a[i]+b[i])%y]=true;
dp[i][(j+a[i]-b[i])%y]=true; //利用第i个数字到达新的高度
}
for(int i=y-1;i>=0;i--) //最大取值一定小于y
{
if(dp[n][i])
{
cout<<i<<endl;
break;
}
}
}
当了一天工具人,这不会是在预示。。。