Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

1170 用贪心算法来做,结果是WA,请高手指点!

Posted by GaryLiang at 2009-08-12 16:40:35 and last updated at 2009-08-12 16:40:55
1170 用贪心算法来做,就是每次选择这样一个offer ,使得这次offer的付款与剩余商品(直接用 数量*价格)的和最小,题目中带的测试数据是正确的,但提交后结果是WA,很郁闷啊,高手指点,代码如下:
// 1170_ShoppingOffers.cpp : 定义控制台应用程序的入口点。
//



#include <iostream>
using namespace std;


class Item{
public:
	int id;
	int num;
	int price;
};

class Pair{
public:
	int id;
	int num;
};

class Com{
public:
	int np;
	Pair pr[6];
	int total;
};
int main(){
	int kind[10];
	Item items[10];
	Item itemstp[10];
	Com comb[100];
 
	int b;
	cin>>b;
	for(int i=0;i<b;i++){
		Item imt;
		cin>>imt.id;
		cin>>imt.num;
		cin>>imt.price;
		items[i]=imt;
		kind[i]=imt.id;
	}
	
	int s;
	cin>>s;
	for(int i=0;i<s;i++){
		Com combt;
		cin>>combt.np;
		for(int j=0;j<combt.np;j++){
			cin>>combt.pr[j].id;
			cin>>combt.pr[j].num;
		}
		cin>>combt.total;
		comb[i]=combt;
		
	}

	int totalpay=0;
	for(int i=0;i<b;i++){
		totalpay+=items[i].num*items[i].price;
	}
	int shouldpay=totalpay;
	
	int index=-1;

	int pay=0;
    
	bool fg=true;
	while(fg){
		index=-1;
		fg=false;
		for(int i=0;i<s;i++){
			for(int a=0;a<b;a++){
				itemstp[a].id=items[a].id;
				itemstp[a].num=items[a].num;
				itemstp[a].price=items[a].price;
			}
			bool flag=true;
			int prs=comb[i].np;
			for(int j=0;j<prs;j++){
				int idi=comb[i].pr[j].id;
				int numi=comb[i].pr[j].num;
				int indexi=-1;
				for(int t=0;t<b;t++){
					if(kind[t]==idi){

						indexi=t;
						break;
					}
				}
				if(itemstp[indexi].num<numi){
					flag=false;
					break;
				}
				else{
					itemstp[indexi].num-=numi;
				}
			}
			if(flag){
				int sp=comb[i].total;
				for(int h=0;h<b;h++){
					sp+=itemstp[h].num*itemstp[h].price;
				}
				if(sp<shouldpay){
					shouldpay=sp;
					index=i;
				}

			}
		}

		if(index!=-1){
			int pis=comb[index].np;
			for(int g=0;g<pis;g++){
				int idg=comb[index].pr[g].id;
				int indexg=-1;
				for(int c=0;c<b;c++){
					if(kind[c]==idg){
						indexg=c;
						break;
					}
				}
				items[indexg].num-=comb[index].pr[g].num;
			}
			pay+=comb[index].total;
			fg=true;
		}
	}

	for(int i=0;i<b;i++){
		pay+=items[i].num*items[i].price;
	}
	cout<<pay;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator