| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
求救,2184我觉着这是用转化的想法写的,但还是超时.请高人指点
#include<iostream.h>
struct cows
{
short s,f;
};
struct cows cow[100];
short n,num;
void main()
{
//fstream cin;
//cin.open("input.txt",ios::in);
cin>>num;
n=0;
short xh1;
int ts,tf;
ts=0;
tf=0;
for (xh1=0;xh1<num;xh1++)
{
cin>>cow[n].s>>cow[n].f;
if (cow[n].s>=0 && cow[n].f>=0)
{
ts+=cow[n].s;
tf+=cow[n].f;
continue;
}
if (cow[n].s<=0 && cow[n].f<=0) continue;
if (cow[n].s+cow[n].f>=0)
if (cow[n].s>0)
{
ts+=cow[n].s;
tf=tf+cow[n].f;
cow[n].s*=-1;
cow[n].f*=-1;
n++;
}
else
{
ts=ts+cow[n].s;
tf+=cow[n].f;
cow[n].s*=-1;
cow[n].f*=-1;
n++;
}
else n++;
}
//读入完成
if (n==0)
{
cout<<ts+tf<<endl;
return;
}
if (ts>=0 && tf>=0)
{
cout<<ts+tf<<endl;
return;
} //先把一些情况输出
//prework finished
short cho[100];
short top;
int MAX=0;
top=0;
cho[top]=-1;
while (top>=0) //找去掉那些奶牛可使问题有解
{
if (top==n)
{
top--;
ts=ts-cow[cho[top]].s;
tf=tf-cow[cho[top]].f;
continue;
}
cho[top]++;
if (cho[top]==n)
{
top--;
ts=ts-cow[cho[top]].s;
tf=tf-cow[cho[top]].f;
continue;
}
ts+=cow[cho[top]].s;
tf+=cow[cho[top]].f;
if (ts>=0 && tf>=0) //剪枝条件1,有可行解
{
if (MAX<ts+tf) MAX=ts+tf;
ts=ts-cow[cho[top]].s;
tf=tf-cow[cho[top]].f;
continue;
}
if (ts+tf<MAX) //剪枝条件2,不可能有更好的解
{
ts=ts-cow[cho[top]].s;
tf=tf-cow[cho[top]].f;
continue;
}
top++;
cho[top]=cho[top-1];
}
cout<<MAX<<endl;
// cin.close();
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator