CCF 20171203(商路)
2018-03-16 16:28
148 查看
题目分析:
题目很长,有点儿不理解,后来看人家的代码,边看边调,才知道自己误解了题目的意思。
本来想着应该是dp,就是每个城市的商路最大价值是它的下级中的最大价值或者是它到其中一个城市的价值。后来发现不可以是取它下级中的最大价值,因为这个城市的商路最大价值是有可能小钰它下级的最大价值的。所以应该在每一个最后的没有下级的城市向上遍历它的上级,即不断更新如果上级直接到这个城市的最大价值。
未满分。#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100010;
const long long Mod = 1e18;
long long f[maxn],u[maxn],s[maxn],v[maxn];
long long ans[maxn];
long long q[maxn];
int vis[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
memset(q,0,sizeof(q));
memset(ans,0,sizeof(ans));
int n;
scanf("%d",&n);
for(int i = 1; i <= n; i ++)
{
scanf("%d%d%d%d",&u[i],&s[i],&v[i],&f[i]);
vis[u[i]]++;
}
int q1=0,q2=0;
for(int i = 1; i <= n; i ++)
if(vis[i] == 0 )
q[q1++] = i;
while(q1 > q2)
{
int k = q[q2++];
int u1 = u[k];
int d = s[k];
vis[u1]--;
if(vis[u1] == 0) q[q1++] = u1;
while(u1)
{
ans[u1] = max(ans[u1],ans[k] + v[u1] - (f[u1]-d)*(f[u1]-d));
d += s[u1];
u1 = u[u1];
}
}
long long cnt=0;
for(int i=1 ; i <= n; i++)
cnt =(cnt + ans[i])%Mod;
cout<<cnt<<endl;
}
return 0;
}
题目很长,有点儿不理解,后来看人家的代码,边看边调,才知道自己误解了题目的意思。
本来想着应该是dp,就是每个城市的商路最大价值是它的下级中的最大价值或者是它到其中一个城市的价值。后来发现不可以是取它下级中的最大价值,因为这个城市的商路最大价值是有可能小钰它下级的最大价值的。所以应该在每一个最后的没有下级的城市向上遍历它的上级,即不断更新如果上级直接到这个城市的最大价值。
未满分。#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100010;
const long long Mod = 1e18;
long long f[maxn],u[maxn],s[maxn],v[maxn];
long long ans[maxn];
long long q[maxn];
int vis[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
memset(q,0,sizeof(q));
memset(ans,0,sizeof(ans));
int n;
scanf("%d",&n);
for(int i = 1; i <= n; i ++)
{
scanf("%d%d%d%d",&u[i],&s[i],&v[i],&f[i]);
vis[u[i]]++;
}
int q1=0,q2=0;
for(int i = 1; i <= n; i ++)
if(vis[i] == 0 )
q[q1++] = i;
while(q1 > q2)
{
int k = q[q2++];
int u1 = u[k];
int d = s[k];
vis[u1]--;
if(vis[u1] == 0) q[q1++] = u1;
while(u1)
{
ans[u1] = max(ans[u1],ans[k] + v[u1] - (f[u1]-d)*(f[u1]-d));
d += s[u1];
u1 = u[u1];
}
}
long long cnt=0;
for(int i=1 ; i <= n; i++)
cnt =(cnt + ans[i])%Mod;
cout<<cnt<<endl;
}
return 0;
}
相关文章推荐
- CCF 2017年12月第5题-商路
- ccf-20171203 Crontab问题
- CCF 201509-3 我参考别人 100分
- 第二次CCF-4-无线网络(二维最短路-spfa)
- CCF模拟题 出现次数最多的数
- CCF 201403-2 窗口 题解
- CCF 201609-4 交通规划
- ccf 高速公路(顺便当tarjan模板)
- CCF 201409-1 相邻数对 (水题)
- CCF_201604-3_路径解析
- CCF游戏
- CCF字符串匹配
- CCF-交通规划(最短路变形->dj算法)
- ccf 游戏 <BFS+队列剪枝方法>
- 关于新手考CCF认证的一点心得&新手注意
- 权限查询-CCF往届题(结果:90分,超时)
- CCF 2014 3-1 相反数
- ccf试题 工资计算
- CCF之ISBN号码(java)
- CCF之节日(java)