2015-9-13 NOIP模拟赛解题报告(by hzwer)
小奇挖矿
「题目背景」
小奇要开采一些矿物,它驾驶着一台带有钻头(初始能力值w)的飞船,按既定路线依次飞过喵星系的n个星球。
「问题描述」
星球分为2类:资源型和维修型。
1.资源型:含矿物质量a[i],若选择开采,则得到a[i]p的金钱,之后钻头损耗k%,即p=p(1-0.01k)
2.维修型:维护费用b[i],若选择维修,则支付b[i]p的金钱,之后钻头修复c%,即p=p(1+0.01c)
(p为钻头当前能力值)
注:维修后钻头的能力值可以超过初始值
请你帮它决策最大化这个收入
「输入格式」
第一行4个整数n,k,c,w。
以下n行,每行2个整数type,x。
type为1则代表其为资源型星球,x为其矿物质含量a[i];
type为2则代表其为维修型星球,x为其维护费用b[i];
「输出格式」
输出一行一个实数(保留两位小数),表示要求的结果。
「样例输入」
5 50 50 10
1 10
1 20
2 10
2 20
1 30
「样例输出」
375.00
「数据范围」
对于30%的数据 n<=100
对于50%的数据 n<=1000,k=100
对于100%的数据 n<=100000,0<=k,c,w,a[i],b[i]<=100
保证答案不超过10^9
动态规划。因为观察到每一个操作对它后面的操作具有影响,根据DP无后效性原则,我们考虑从后往前DP。然后观察到每次操作后面的收益都和p成正比。所以我们设\(dp[i]\)为在第\(i\)个星球且当前\(p=1\)(单位1)的时候最大的收益。
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define MAXN 100010
using namespace std;
double dp[MAXN];
int k,c,n,w;
int name[MAXN],val[MAXN];
int main()
{
scanf("%d%d%d%d",&n,&k,&c,&w);
for(int i=1;i<=n;i++)
scanf("%d%d",&name[i],&val[i]);
double kk=(1-0.01*(double)k);
double cc=(1+0.01*(double)c);
for(int i=n;i>=1;i--)
{
if(name[i]==1) dp[i]=max(dp[i+1],dp[i+1]*kk+val[i]);
else dp[i]=max(dp[i+1],dp[i+1]*cc-val[i]);
}
printf("%.2lf\n",dp[1]*w);
return 0;
}
小奇的数列
「题目背景」
小奇总是在数学课上思考奇怪的问题。
「问题描述」
给定一个长度为n的数列,以及m次询问,每次给出三个数l,r和P,询问 (a[l’] + a[l’+1] + … + a[r’]) mod P的最小值。
其中l <= l’ <= r’ <= r。
即模意义下的区间子串和最小值。
「输入格式」
第一行包含两个正整数n和m,表示数列的长度和询问的个数。
第二行为n个整数,为a[1]..a[n]。
接下来m行,每行三个数l,r和P,代表一次询问。
「输出格式」
对于每次询问,输出一行一个整数表示要求的结果
「样例输入」
4 2
8 15 9 9
1 3 10
1 4 17
「样例输出」
2
1
「数据范围」
对于20%的数据 n<=100,m<=100,p<=200
对于40%的数据 n<=200,m<=1000,p<=500
对于70%的数据 n<=100000,m<=10000,p<=200
对于100%的数据 n<=500000,m<=10000,p<=500,1<=a[i]<=10^9
正解是平衡树。。。但是我不太会。。。这个坑先放这里,,,(然后附上黄学长博文链接:http://hzwer.com/7613.html)
小奇回地球
「题目背景」
开学了,小奇在回地球的路上,遇到了一个棘手的问题。
「问题描述」
简单来说,它要从标号为1的星球到标号为n的星球,某一些星球之间有航线。由于超时空隧道的存在,从一个星球到另一个星球时间可能会倒流,而且,从星球a到b耗费的时间和星球b到a耗费的时间不一定相同。
宇宙法规定:“禁止在出发时间前到达目的地。”
每艘飞船上都有速度调节装置,可以调节飞行的时间。其功能可以使得整次航程中所有两星球间的飞行时间增加或减少相同的整数值。你的任务是帮助它调整速度调节器,找出一条最短时间到达目的地的路径。
「输入格式」
输入文件包含多组数据,第1个数为T,表示数据组数。
对于每组数据,输入第1行为两个正整数n,m,为星球的个数和星球间的路线数。接下来m行,每行三个整数i,j和t,表示由星球i到星球j飞行的时间为t。由i到j最多只会有一条飞行线路。
「输出格式」
输出文件共T行,每组数据输出一行。
如果可以通过调节速度调节器完成任务,则输出一个非负整数,表示由星球1到星球n的最短时间。(注意最短时间要大于或者等于0)。
如果不能由星球1到达星球n,则输出-1。
「样例输入」
1
4 5
1 2 1
1 3 1
2 3 -3
3 1 1
3 4 1
「样例输出」
2
「样例解释」
把速度控制器的值设为1,相当于每个时间值加1,得到的最短路径为1→2→3→4,所需时间为2+(-2)+2=2。
「数据范围」
1,2号测试点,保证所有星球出度不超过1
3,4号测试点,n<=10
5,6号测试点,-100<=t<=100
对于100%的数据T<=10,n<=100,m<=n*(n-1),-100000<=t<=100000
数据随机和构造结合生成
就是枚举出来答案然后判断合不合法。枚举的过程可以使用二分加速。
注意中间会有负环的情况。但是因为不是每个点都会到终点的。所以如果到终点的最短路上没有负环而且从起点到终点的最短路的值大于0即可。
开始先建个反图,使用dfs找一下哪些节点是可以到终点的,打个标记。
我写题的时候zz了,每次更换枚举的增加值的时候还重新建边了。。。。但是其实是可以在spfa跑最短路的时候直接处理的。。这个以后要记住qwq
然后就没有什么了。。。。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define MAXN 100100
using namespace std;
int n,m,edge_number,t,ans;
int u[MAXN],v[MAXN],w[MAXN],len[MAXN];
int dis[MAXN],done[MAXN],head[MAXN],avl[MAXN];
struct Edge{int nxt,to,dis;}edge[MAXN<<1];
inline void add(int from,int to,int dis)
{
edge[++edge_number].dis=dis;
edge[edge_number].to=to;
edge[edge_number].nxt=head[from];
head[from]=edge_number;
}
inline int spfa(int x)
{
queue<int>q;
for(int i=1;i<=n;i++) dis[i]=2147483647,done[i]=0,len[i]=0;
q.push(1); done[1]=1; dis[1]=0; len[1]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
done[u]=0;
for(int i=head[u];i;i=edge[i].nxt)
{
int v=edge[i].to;
if(avl[v]==0) continue;
if(dis[v]>dis[u]+edge[i].dis+x)
{
dis[v]=dis[u]+edge[i].dis+x;
if(!done[v])
{
done[v]=1;
len[v]=len[u]+1;
if(len[v]>n)
return -1;
q.push(v);
}
}
}
}
return dis[n];
}
void dfs(int u)
{
avl[u]=1;
for(int i=head[u];i;i=edge[i].nxt)
if(!avl[edge[i].to])
dfs(edge[i].to);
}
int main()
{
scanf("%d",&t);
while(t--)
{
memset(head,0,sizeof(head));
memset(avl,0,sizeof(avl));
scanf("%d%d",&n,&m);
int l=-100000,r=100000;
for(int i=1;i<=m;i++)
scanf("%d%d%d",&u[i],&v[i],&w[i]);
for(int i=1;i<=m;i++)
add(v[i],u[i],w[i]);
dfs(n);
memset(head,0,sizeof(head));
edge_number=0;
for(int i=1;i<=m;i++)
add(u[i],v[i],w[i]);
if(!avl[1])
{
printf("-1\n");
continue;
}
while(l<r)
{
int mid=(l+r)>>1;
long long cur=spfa(mid);
if(cur>=0) r=mid,ans=cur;
else l=mid+1;
}
printf("%d\n",ans);
}
return 0;
}
100+40+50=190分收场。。。。真真是蒟蒻被吊打的节奏啊qwq。。。。
2015-9-13 NOIP模拟赛解题报告(by hzwer)的更多相关文章
- 2018.10.16 NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...
- 2017.9.17校内noip模拟赛解题报告
预计分数:100+60+60=220 实际分数:100+60+40=200 除了暴力什么都不会的我..... T1 2017.9.17巧克力棒(chocolate) 巧克力棒(chocolate)Ti ...
- 20161022 NOIP模拟赛 解题报告
好元素 [问题描述] 小A一直认为,如果在一个由N个整数组成的数列{An}中,存在以下情况: Am+An+Ap = Ai (1 <= m, n, p < i <= N , m,n ...
- 9月24日noip模拟赛解题报告
1.校门外的树(tree.c/cpp/pas 128M,1s) Description LSGJ扩建了,于是校门外有了一条长为L的路.路上种了一排的树,每相邻两棵树之间的距离为1,我们可以把马路看成一 ...
- 2018-11-1 NOIP 模拟赛解题报告
T1 Domino 多米诺骨牌 题目大意 给你N个骨牌,上下各有一个数,要使上面一排的和为偶数,同时下面一排的和也为偶数,最多要翻转多少次?如果无法达成那么输出-1. 解法 水题秒切 根据数的奇偶性质 ...
- 2019.03.13 ZJOI2019模拟赛 解题报告
得分: \(55+12+10=77\)(\(T1\)误认为有可二分性,\(T2\)不小心把\(n\)开了\(char\),\(T3\)直接\(puts("0")\)水\(10\)分 ...
- 2018.10.03 NOIP+ 模拟赛 解题报告
得分: \(30+5+0=35\)(考得真不咋滴) \(T1\):奥义商店(点此看题面) 以为很简单,对着这题想了一个多小时,最后果断打了个暴力交了... ... 看完题解发现其实也不是很难. 对于\ ...
- 10.30 NFLS-NOIP模拟赛 解题报告
总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...
- 20201101gryz模拟赛解题报告
写在前面 2020rp++ 停课的第一场模拟赛 拿上一年的上一年的day1来考的, 结果得分期望220pts,实际135pts,rank3,太菜了 考着考着机房灯突然灭了,当时慌的一批 以为断电代码要 ...
随机推荐
- GitHub个人使用入门
今天突然想起来了github 于是开始了入门之旅 如果你用过svn 那么你用起来感觉入门比较快的(至少我是这么感觉的)和在svn服务器上建项目的流程很像 每次修改代码之后提交的过程是: add, co ...
- Python迭代dict的value
我们已经了解了dict对象本身就是可迭代对象,用 for 循环直接迭代 dict,可以每次拿到dict的一个key. 如果我们希望迭代 dict 对象的value,应该怎么做? dict 对象有一个 ...
- python+Django创建第一个项目
1.首先搭建好环境 1.1 安装pyhton,Linux系统中,python是系统自带的所以就不用安装 1.2 安装Django框架 使用pip安装: pip install django 1.3 检 ...
- mysqldump test
CREATE TABLE IF NOT EXISTS `runoob_tbl`( `runoob_id` INT UNSIGNED AUTO_INCREMENT, `runoob_title` VAR ...
- 2018-2019第一学期Java助教心得
随着期末考试落下了帷幕,本学习也结束了回顾本学期的历程,对我影响最深的还是这学期很幸运的成为代老师的助教,这也是我第一次接触助教工作.刚开始的时候我心里也有很多的担心,怕自己胜任不了这份工作,但随着时 ...
- 浅析 python中的 print 和 input 的底层区别!!!
近期的项目中 涉及到相关知识 就来总结一下 ! 先看源码: def print(self, *args, sep=' ', end='\n', file=None): # known special ...
- 111. Minimum Depth of Binary Tree (Tree; DFS)
Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shor ...
- 新做的系统,第一次拉maven项目时,鼠标左键+ctrl键不能进方法
对项目选择属性,跳转至:选择以下步骤
- jQuery autocomplete -默认
<!doctype html> <html> <head> <meta name="content-type" content=" ...
- extends注意事项
属性可以在子类中被调用,而局部变量不可以