2024-04-10竞赛笔记

2024/4/10

知识

abababbaba

题目

T1 ACW1024 宠物小精灵之收服

这道题很离谱……ACW上的这个代码在YBT过了……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<bits/stdc++.h>
using namespace std;
int n,m,k,cost;
int v[1000001],u[1000001];
int dp[10001][10001];//前i个精灵,在消耗精灵球不超过n,皮卡丘扣血不超过m时,能获得的最大精灵数
int main(){
cin>>n>>m>>k;
for(int i=1;i<=k;i++) cin>>v[i]>>u[i];
for(int i=1;i<=k;i++){ //小精灵
for(int j=n;j>=v[i];j--){ //消耗精灵球
for(int k=m-1;k>=u[i];k--){ //皮卡丘扣血
dp[j][k]=max(dp[j][k],dp[j-v[i]][k-u[i]]+1);//状态转移方程
}
}
}
cout<<dp[n][m-1]<<' ';
cost=m; //初始扣血为t
for(int i=0;i<=m-1;i++){ //找到满足最大价值的所有状态里,第二维费用消耗最少的
if(dp[n][i]==dp[n][m-1]){
cost=min(cost,i);//最小
}
}
cout<<m-cost<<endl;
return 0;
}

T2 P1802 5 倍经验日

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<bits/stdc++.h>
using namespace std;
long long dp[110000],w[110000],l[110000],u[110000];
int n,m;
int main()
{
cin>>n>>m;//好友数,瓶子数
for(int i=1;i<=n;i++) cin>>l[i]>>w[i]>>u[i];//lose,win,已经要use的
for(int i=1;i<=n;i++)
{
for(int j=m;j>=u[i];j--) dp[j]=max(dp[j]+l[i]/*直接lose*/,dp[j-u[i]]+w[i]/*打掉瓶子所获得的胜利的经验*/);//比较win和lose那个n*一点
for(int j=u[i]-1/*用不了(不够)的*/;j>=0;j--) dp[j]+=l[i];//打不过直接die
}
cout<<5*dp[m]<<endl;//五倍经验所以*5
}