C - Terse princess
题意:有个公主找王子,如果这个人比之前所有王子的财富都高,公主就Oh,如果这个人比之前所有的财富值的总和加起来还多,就WOW,输出一个序列满足a,b,如果没有就输出-1
思路:
就是先优先处wow然后在优先处理oh
先把较大的处理完然后再处理较小的
先从1开始
注意的点:
1.1 2这种情况是算wow的情况,不能算成oh的情况
2.同时要注意输出-1的条件
#include<bits/stdc++.h>
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
int main()
{
int n,a,b,i;
cin>>n>>a>>b;
int num[n]={0};
num[0]=1;
int falg=1;
if(a>0)
{
a=a-1;
num[1]=2;
}
else
{
num[1]=1;
}
for(i=2;i<n;i++)
{
if(b>0)
{
for(int j=0;j<i;j++)
{
num[i]=num[i]+num[j]+1;
}
if(num[i]>=50000)
{
break;
}
b--;
}
else
{
if(a>0)
{
num[i]=num[i-1]+1;
a--;
if(num[i]>=50000)
{
break;
}
}
else
{
num[i]=1;
}
}
}
if(i<n)
{
cout<<-1<<endl;
}
else
{
for(int i=0;i<n-1;i++)
{
cout<<num[i]<<" ";
}
cout<<num[n-1]<<endl;
}
}
从网上看的大佬的代码
之前我写的思路是差不多的但是我输出-1的条件不太对
要注意1 2这种情况是算wow的情况,不能算成oh的情况
通过a||b判断是否输出-1
#include<bits/stdc++.h>
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int MAXN = 1e5 + 7;
int num[110];
int main()
{
int n, a, b;
while(cin>>n)
{
cin>>a>>b;
num[1]=1;
int tot=1;
int sum=1;
for(int i=2;i<=n;i++)
{
if(b)
{
tot=sum+1;
b--;
}
else if(a&&i>2)
{
tot++;
a--;
}
num[i]=tot;
sum+=tot;
}
if(a||b)
{
cout<<-1<<endl;
return 0;
}
for(int i = 1; i < n; i++)
cout<<num[i]<<" ";
cout<<num[n]<<endl;
}
return 0;
}
E - Porcelain
这个题跟之前“中竞杯”那个爬塔的题非常的相像,但是最后由于我对背包类题目掌握的不透彻,所以这个题还是没有打出来,但是这个也就是背包类的问题
经典背包问题
背包问题合集
然后就从博客上学习了一下背包的思路
题解:
构造sum[i][j]数组表示表示第i层砸j个花瓶能获取的最大价值,考虑用每层体积为k,价值为sum[i][k]的物品,对每层来说,只能去1个数据,最后用背包求解,再额外一层循环
#include<bits/stdc++.h>
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int MAXN = 1e5 + 7;
int num[110][110];
int a[110];
int sum[110][110];
int dp[110][11000];
int main()
{
memset(num,0,sizeof(num));
memset(sum,0,sizeof(sum));
memset(dp,0,sizeof(dp));
memset(a,0,sizeof(a));
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
for(int j=1;j<=a[i];j++)
{
int x;
cin>>x;
num[i][j]=num[i][j-1]+x;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=a[i];j++)
{
int l=a[i],r=j;
for(int t=0;t<=j;t++)
{
sum[i][j]=max(sum[i][j],num[i][r]+num[i][a[i]]-num[i][l]);
l--;
r--;
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=m;j>=0;j--)
{
for(int k=0;k<=a[i]&&k<=j;k++)
{
dp[i][j]=max(dp[i][j],dp[i-1][j-k]+sum[i][k]);
}
}
}
cout<<dp[n][m]<<endl;
return 0;
}