算法竞赛入门题目

http://10.1.5.12/JudgeOnline/problem.php?id=1957
题目链接;
做了好久,终于憋出来了这道题
首先的思路是 优先分配执行时间长的,但是一把执行时间排序之后会有一个问题;
那就是士兵的分配时间与执行时间会打乱;
那怎么办呢?我的办法是在建立一个数组把原来未排序的执行时间保存好,记住相应的位置,
在建立一个bool 型的数组防止重复,就可以解决问题了;
#include
#include
#include
#include
using namespace std;
int n,m,j,sum=0,t,s=0;
int a[1100],b[1100];
int c[1100];
bool d[1100];
int x=1;
int lmp(int x,int y)
{
return x>y;
}
int main()
{
for(;cin >> n;)
{
if(n==0) break;
int j;
int k=0;
sum=0;
s=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof©);
memset(d,0,sizeof(d));
for(int i=0;i<n;i++)
cin >> a[i] >> b[i];
for(int i=0;i<n;i++)
{
sum+=a[i];
c[i]=b[i];
}
sort(b,b+n,lmp);
sum+=b[n-1];
t=sum;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(c[j]==b[i] && d[j]==0)
{
k=j;
d[j]=1;
break;
}
}
sum-=a[k];
if(b[i]>sum)
{
s=max(s,(b[i]-sum));
}
}
sum=t+s;
cout <<"Case "<< x << “:”<< " ";
cout << sum << endl;
x++;
}
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值