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 |
DFS 0MS AC 注释详细#include <stdio.h> struct Thing { short idx;//代替物品索引 int truecost;//找到代替物品之后的价格 }; struct Node { int worth;//此人持有物品的价格 short lv;//此人等级 short sum;//此人的替代品数量 struct Thing inside[102];//替代品数组 }; struct Node data[102] = {0};//数据 bool foot[102] = {0};//访问标记数组 int m,n;//最大差距 人数 int dfs(int tobuy,int lvmin,int lvmax)//要买的那件物品 当前交易过的人的最小等级和最大等级 { if(0 == data[tobuy].sum)//如果没有替代品 return data[tobuy].worth; int i,j,k; int min = data[tobuy].worth;//首先认为不用替代品 int tempmin = min; for(i =1;i<=data[tobuy].sum;i++)//对于这个人的没一件替代品 { int temp1 = lvmin,temp2 = lvmax;//中间变量 便于回溯 if(lvmax == 10000)//如果是第一次 将最大最小等级初始化 temp1 = temp2 = lvmax = lvmin = data[tobuy].lv; if(data[data[tobuy].inside[i].idx].lv<lvmin)//如果持有第i件替代品的主人等级小于当前最小等级 则更新 temp1 = data[data[tobuy].inside[i].idx].lv; if(data[data[tobuy].inside[i].idx].lv>lvmax)//如果持有第i件替代品的主人等级大于当前最大等级 则更新 temp2 = data[data[tobuy].inside[i].idx].lv; if(lvmax == 10000 || !foot[tobuy] && temp2-temp1<=m)//如果是第一次 或者 此人没有被交易并且更新后的等级查满足要求 { foot[tobuy] = true;//标记为访问 //去买第i件替代品 返回他的最小价格 tempmin = data[tobuy].inside[i].truecost + dfs(data[tobuy].inside[i].idx,temp1,temp2); foot[tobuy] = false;//回溯 if(tempmin < min) { min = tempmin; } } } return min;//返回买第tobuy件物品的最小价格 } int main() { while(EOF != scanf("%d%d",&m,&n)) { int i,j,k; for(i = 1;i<=n;i++) { scanf("%d%d%d",&data[i].worth,&data[i].lv,&data[i].sum); for(j = 1;j<=data[i].sum;j++) { scanf("%d%d",&data[i].inside[j].idx,&data[i].inside[j].truecost); } } printf("%d\n",dfs(1,-10000,10000)); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator