目前鄙人在xdoj处于一个很玄学的排名,前方是上届acm基地主席,而超越他之后,就是百题关了。
1146: 万神的竞赛
思路:这题就是个典型的背包问题,然而背包容量过大,瞬间有点懵逼
后来突然想到背包的转化,普通背包是求规定容量下的最大价值,由于价值范围很小,我们可以求获得相应价值所需的最小背包容量,一开始均初始化为一个大数,做完背包dp后,从大到小寻找第一个能满足的价值(即所需体积不大于背包容量,可以装入背包)
最后,还是细心啊,注意数组范围,一发re送给自己,作为警醒
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>
using namespace std;
const int maxnv = 5e4+10;
const int maxn = 1e3+10;
int v[maxn],w[maxn];
int dp[maxnv];
int main()
{
int n,W;
while(scanf("%d%d",&n,&W)!=EOF)
{
int maxv = 0;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&w[i],&v[i]);
maxv += v[i];
}
for(int i=0;i<=maxv;i++)
{
dp[i] = 1e9;
}
dp[0] = 0;
for(int i=1;i<=n;i++)
{
for(int j=maxv;j>=v[i];j--)
{
if(dp[j] > dp[j-v[i]] + w[i])
{
dp[j] = dp[j-v[i]] + w[i];
}
}
}
int re;
for(re=maxv;re>=0;re--)
{
if(dp[re] <= W)
{
break;
}
}
printf("%d\n",re);
}
return 0;
}
1015: 无聊的Light Light
思路:这题典型的贪心,首先长度越长越好,于是以最小费用计算最大长度,将整个串都先预处理成该最小费用数,再从高位开始贪心,同时可更新位也从9开始递减,判断是否可以满足该换位条件,进行换位,最终换位结束即可得到最终结果
一开始还担心输出会有坑,于是加了好几个判断条件,后来突然发现出题人很厚道,连空格都不需要输出,那么就直接ac喽
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>
using namespace std;
const int maxn = 1e5+10;
int a[10];
int re[maxn];
int main()
{
int w;
while(scanf("%d",&w)!=EOF)
{
int mincost = maxn;
int maxpos = 0;
for(int i=1;i<=9;i++)
{
scanf("%d",&a[i]);
if(a[i]<=mincost)
{
mincost = a[i];
maxpos = i;
}
}
int len = w/mincost;
int lef = w-len*mincost;
if(len==0)
{
printf("-1\n");
continue;
}
int pos = 9;
int id = 0;
for(;id<len;id++)
{
if(pos == maxpos)
{
break;
}
if(lef>=a[pos] - mincost)
{
lef -= a[pos] - mincost;
re[id] = pos;
}
else
{
pos--;
id--;
}
}
/*if(id==0)
{
printf("%d",maxpos);
id++;
//cout << "*";
}
else
{
printf("%d",re[0]);
//cout << "*";
}*/
for(int i=0;i<id;i++)
{
printf("%d",re[i]);
//cout << "**";
}
for(int i=id;i<len;i++)
{
printf("%d",maxpos);
//cout << "***";
}
//cout << len << endl;
printf("\n");
}
}
ok,完成超越,短时期内的目标完成了,至于百题斩,将是下一个目标了,加油吧