HDU 3696&& FZU 2006 -- Farm Game
2017-04-21 12:48
344 查看
题意: 给出每个种类产品的数量和单价, 以及他们之间单向的转化关系。询问最大利益
思路: 将每个种类 通过转化关系后的最大单价求出,去乘数量,求和。
转化率是个小数,通过乘法关系会失去精度,取log 变为+法、 网上都是这么说的。。。。
但是我觉得取log 是因为把乘法变为加法后,目的是为了变为最短路spfa的加减法的模型,否则如果是乘除法的关系,无法跑最短路。
在跑最短路的时候 建立一个超级原点,求这个原地到每个种类的距离(最大单价)。 也就是一个最长路模型
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <vector>
#include <cmath>
#include <stack>
using namespace std;
const int maxn=100005;
typedef long long ll;
vector<pair<int ,double > > vec[maxn];
int vis[maxn];
double p[maxn],w[maxn];
double dis[maxn];
int n,m;
int spfa(int st)
{
for(int i=0;i<=n;i++)
{
vis[i]=0,dis[i]=0;
}
vis[st]=1,dis[st]=0;
deque<int>q;
q.push_front(st);
int u;
while(!q.empty())
{
u=q.front();
q.pop_front();
vis[u]=0;
for(int i=0; i<vec[u].size(); i++)
{
int v=vec[u][i].first;
double w=vec[u][i].second;
if( dis[v] < w+dis[u] )
{
dis[v]=w+dis[u];
if(!vis[v])
{
vis[v]=1;
if(!q.empty()&&dis[v]<dis[q.front()])
q.push_back(v);
else
q.push_front(v);
}
}
}
}
return 1;
}
int main()
{
while(~scanf("%d",&n ),n )
{
for(int i=0; i<maxn; i++)
vec[i].clear();
for(int i=1; i<=n; i++)
{
scanf("%lf%lf",&p[i],&w[i]);
vec[0].push_back(make_pair(i,log10(p[i])));
}
scanf("%d",&m);
4000
for(int i=1;i<=m;i++)
{
int k,a,b;
scanf("%d%d",&k,&a);
k--;
double px;
while(k--)
{
scanf("%lf%d",&px,&b);
px=log10(px);
vec[b].push_back(make_pair(a,px));
a=b;
}
}
spfa(0);
double ans=0;
for(int i=1;i<=n;i++)
{
if(p[i]<pow(10.0,dis[i]))
p[i]=pow(10.0,dis[i]);
ans+=p[i]*w[i];
}
printf("%.2lf\n",ans);
}
return 0;
}
思路: 将每个种类 通过转化关系后的最大单价求出,去乘数量,求和。
转化率是个小数,通过乘法关系会失去精度,取log 变为+法、 网上都是这么说的。。。。
但是我觉得取log 是因为把乘法变为加法后,目的是为了变为最短路spfa的加减法的模型,否则如果是乘除法的关系,无法跑最短路。
在跑最短路的时候 建立一个超级原点,求这个原地到每个种类的距离(最大单价)。 也就是一个最长路模型
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <vector>
#include <cmath>
#include <stack>
using namespace std;
const int maxn=100005;
typedef long long ll;
vector<pair<int ,double > > vec[maxn];
int vis[maxn];
double p[maxn],w[maxn];
double dis[maxn];
int n,m;
int spfa(int st)
{
for(int i=0;i<=n;i++)
{
vis[i]=0,dis[i]=0;
}
vis[st]=1,dis[st]=0;
deque<int>q;
q.push_front(st);
int u;
while(!q.empty())
{
u=q.front();
q.pop_front();
vis[u]=0;
for(int i=0; i<vec[u].size(); i++)
{
int v=vec[u][i].first;
double w=vec[u][i].second;
if( dis[v] < w+dis[u] )
{
dis[v]=w+dis[u];
if(!vis[v])
{
vis[v]=1;
if(!q.empty()&&dis[v]<dis[q.front()])
q.push_back(v);
else
q.push_front(v);
}
}
}
}
return 1;
}
int main()
{
while(~scanf("%d",&n ),n )
{
for(int i=0; i<maxn; i++)
vec[i].clear();
for(int i=1; i<=n; i++)
{
scanf("%lf%lf",&p[i],&w[i]);
vec[0].push_back(make_pair(i,log10(p[i])));
}
scanf("%d",&m);
4000
for(int i=1;i<=m;i++)
{
int k,a,b;
scanf("%d%d",&k,&a);
k--;
double px;
while(k--)
{
scanf("%lf%d",&px,&b);
px=log10(px);
vec[b].push_back(make_pair(a,px));
a=b;
}
}
spfa(0);
double ans=0;
for(int i=1;i<=n;i++)
{
if(p[i]<pow(10.0,dis[i]))
p[i]=pow(10.0,dis[i]);
ans+=p[i]*w[i];
}
printf("%.2lf\n",ans);
}
return 0;
}
相关文章推荐
- HDU 2844+POJ 1014 +FZU 1432详解(多重背包&&二进制优化)
- HDU 2276 & FZU 1692 (矩阵快速幂+循环同构优化)
- HDU 3696 FZU 2006 -- Farm Game SPFA最长路 2010福州区域赛
- fzu 2113 Jason的特殊爱好 && hdu 2089 不要62 ( 数位dp )
- 迟到的感谢——2006最有价值博客的候选人(& 个人回顾)
- 除岁迎新 Java 2005回顾&2006展望
- 迟到的感谢——2006最有价值博客的候选人(& 个人回顾)
- Tech2006(南京)技术大会&第三届CSDN南京区程序员聚会11月19号举行
- Let's see 2005 Year-end Zeitgeist. What's for 2006? Is it * 2.0?
- 除岁迎新 Java 2005回顾&2006展望
- 迟到的感谢——2006最有价值博客的候选人(& 个人回顾)
- 用XenoCode 2006 加密dll (.NET混淆 )http://www.chenjiliang.com/Article/View.aspx?ArticleID=237&TypeID=5
- The Debugger's Handbook - 1st edition (July 28, 2006)
- 迟到的感谢——2006最有价值博客的候选人(& 个人回顾)
- 迟到的感谢——2006最有价值博客的候选人(& 个人回顾)
- 迟到的感谢——2006最有价值博客的候选人(& 个人回顾)
- 全球50大"最牛×.最变态网址推荐---2006版
- 2005 Java 综述&2006 Java 展望
- 迟到的感谢——2006最有价值博客的候选人(& 个人回顾)