zoukankan      html  css  js  c++  java
  • POJ 1062 昂贵的聘礼

    悲剧,poj讨论区所以的测试数据都测试通过了,提交后还是不正确

    #include <iostream>
    #include <map>
    #include <vector>
    #include <set>
    using namespace std;
    
    struct Object
    {
    	int ID;
    	int Level;
    	int Price;
    	map<int,int> Replace;
    public:
    	Object(int id,int level,int price):ID(id),Level(level),Price(price)
    	{
    
    	}
    };
    struct PriceRoute
    {
    	int Price;
    	int Target;
    	vector<int> Route;
    	int Max;
    	int Min;
    	set<int> RemoveNode;
    };
    vector<Object> vec;
    Object* pNode(int i)
    {
    	return &vec[i-1];
    }
    
    vector<PriceRoute> Target;
    bool ExistNode(int obj)
    {
    	for (size_t i=0;i<Target.size();++i)
    	{
    		if (obj==Target[i].Target)
    		{
    			return true;
    		}
    	}
    	return false;
    }
    PriceRoute* pRoute(int Obj)
    {
    	for (size_t i=0;i<Target.size();++i)
    	{
    		if (Target[i].Target==Obj)
    		{
    			return &Target[i];
    		}
    	}
    	return NULL;
    }
    int main()
    {
    	int m,n;
    	cin>>m>>n;
    	
    	int price,level;
    	int id,pri,num;
    	for (int i=0;i<n;++i)
    	{
    		cin>>price>>level>>num;
    		Object obj(i+1,level,price);
    		for (int j=0;j<num;++j)
    		{
    			cin>>id>>pri;
    			obj.Replace.insert(make_pair(id,pri));
    		}
    		vec.push_back(obj);
    	}
    	
    	PriceRoute pr;
    	pr.Price=0;
    	pr.Target=vec[0].ID;
    	pr.Max=vec[0].Level;
    	pr.Min=vec[0].Level;
    	pr.Route.push_back(vec[0].ID);
    	Target.push_back(pr);
    
    	/*int test=0;
    	cout<<"test"<<endl;
    	cin>>test;*/
    	int i=0;
    	while (i<n)
    	{
    		bool bReturn=false;
    		map<pair<PriceRoute*,int>,int> NewRoute;
    		for (vector<PriceRoute>::iterator iter=Target.begin();iter!=Target.end();++iter)
    		{
    			if (iter->Target==0)
    			{
    				continue;
    			}
    			int min=iter->Min;
    			int max=iter->Max;
    
    			int MaxTarget=0;
    			int MaxValue=-100000;
    			
    			int objReturnValue=0;
    			int objReturnNode=0;
    			for (map<int,int>::iterator itObj=pNode(iter->Target)->Replace.begin();
    				itObj!=pNode(iter->Target)->Replace.end();++itObj)
    			{
    				if (ExistNode(itObj->first))
    				{
    					continue;
    				}
    				if (iter->RemoveNode.find(itObj->first)!=iter->RemoveNode.end())
    				{
    					continue;
    				}
    				
    				if (abs(max-pNode(itObj->first)->Level)>m || abs(min-pNode(itObj->first)->Level)>m)
    				{
    					//需要把从差距最大的level开始回退节点
    					bReturn=true;
    					objReturnValue=pNode(itObj->first)->Level;
    					objReturnNode=itObj->first;
    					continue;
    				}
    				int p1=pNode(iter->Target)->Price;
    				int p2=itObj->second;
    				int p3=pNode(itObj->first)->Price;
    
    				if (p1-p2-p3>MaxValue)
    				{
    					MaxValue=p1-p2-p3;
    					MaxTarget=itObj->first;
    				}
    			}
    			if (MaxValue>-100000)
    			{
    				NewRoute.insert(make_pair(make_pair(&(*iter),MaxTarget),MaxValue));
    			}
    			if (bReturn)
    			{
    				int MaxLevelNode=0;
    				int NextNode=objReturnNode;
    				for (int k=iter->Route.size()-1;k>=0;--k)
    				{
    					if (abs(pNode(iter->Route[k])->Level-objReturnValue)>m)
    					{
    						MaxLevelNode=iter->Route[k];
    						break;
    					}
    					PriceRoute* pRouteTarget=pRoute(iter->Route[k]);
    					NextNode=iter->Route[k];
    					if (NULL!=pRouteTarget)
    					{
    						pRouteTarget->Target=0;
    						--i;
    					}
    				}
    				if (0!=MaxLevelNode)
    				{
    					PriceRoute* pRouteTarget=pRoute(MaxLevelNode);
    					if (NULL!=pRouteTarget)
    					{
    						pRouteTarget->RemoveNode.insert(NextNode);
    					}
    				}
    			}
    		}
    		map<pair<PriceRoute*,int>,int>::iterator MaxIter=NewRoute.end();
    		for (map<pair<PriceRoute*,int>,int>::iterator iter=NewRoute.begin();iter!=NewRoute.end();++iter)
    		{
    			if (MaxIter==NewRoute.end())
    			{
    				MaxIter=iter;
    			}
    			else if (iter->second+iter->first.first->Price>MaxIter->second)
    			{
    				MaxIter=iter;
    			}
    		}
    		if (MaxIter!=NewRoute.end())
    		{
    			PriceRoute cpy(*(MaxIter->first.first));
    			cpy.Target=MaxIter->first.second;
    			cpy.Route.push_back(MaxIter->first.second);
    			cpy.Price+=MaxIter->second;
    			if (cpy.Max<pNode(MaxIter->first.second)->Level)
    			{
    				cpy.Max=pNode(MaxIter->first.second)->Level;
    			}
    			if (cpy.Min>pNode(MaxIter->first.second)->Level)
    			{
    				cpy.Min=pNode(MaxIter->first.second)->Level;
    			}
    			cpy.RemoveNode.clear();
    			Target.push_back(cpy);
    			i++;
    		}
    		else if (!bReturn)
    		{
    			break;
    		}
    	}
    	int maxVal=0;
    	for (int i=0;i<Target.size();++i)
    	{
    		if (Target[i].Price>maxVal)
    		{
    			maxVal=Target[i].Price;
    		}
    	}
    	cout<<vec[0].Price-maxVal<<endl;
    	return 0;
    }
    

      

  • 相关阅读:
    Caused by: java.lang.IllegalArgumentException: Not an managed type: class XXX
    SpringBoot配置文件详细解析
    解决eclipse环境下maven项目tomcat启动,未加载到项目的问题
    CSS+元素,鼠标事件触发鼠标模形变成手状的形状
    LeetCode-Wildcard Matching
    LeetCode-NQueensII
    LeetCode-Climbing Stairs
    LeetCode-Word Search
    LeetCode-Minimum Window Substring
    LeetCode-Largest Rectangle in Histogram
  • 原文地址:https://www.cnblogs.com/mandaren/p/3366667.html
Copyright © 2011-2022 走看看