您的位置:首页 > 其它

nyoj 71 独木舟上的旅行

2013-06-15 20:37 302 查看
http://acm.nyist.net/JudgeOnline/problem.php?pid=71

1)法一

分析:该算法是先将载重排序,然后从较重的货物开始,从0寻找符合条件的货物,直到i>=j

#include<iostream>
#include<cstdio>
#include <algorithm>
using namespace std;
int main()
{
int i,j,n,w,t,T,count;
int b[305];
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&w,&n);
for(i=0;i<n;i++)
scanf("%d",&b[i]);
sort(b,b+n);
count=0;
for(i=n-1,j=0;i>=j;i--)
{
t=w-b[i];
if(b[j]<=t&&i>=j)
{
t-=b[j];
j++;
}
count++;
}
printf("%d\n",count);
}
return 0;
}

2)法二
分析:为什么这个反而比较麻烦呢,因为没有看到只有两个人,其实是想实现不限人数的说

#include<iostream>
#include<cstdio>
#include<cstring>
#include <algorithm>
using namespace std;
int main()
{
int i,n,w,t,flag,T,num,count;
int b[305],a[305];
scanf("%d",&T);
while(T--)
{
memset(a,0,sizeof(a));
scanf("%d%d",&w,&n);
for(i=0;i<n;i++)
{
scanf("%d",&num);
b[i]=num;
a[num]++;
}
sort(b,b+n);
count=0;
for(i=n-1;i>=0;i--)
{
if(!a[b[i]]) continue;
a[b[i]]--;
t=w-b[i];
flag=0;
while(t&&!flag)
{
if(a[t])
{
a[t]--;
flag=1;
}
else
t--;
}
count++;
}
printf("%d\n",count);
}
return 0;
}


PS:不限人数的
t=t1=w-b[i];
while(t)
{
if(a[t])
{
a[t]--;
t=t1-t;
t1=t;
}
else
t--;
}
count++;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: