泉五培训Day3
T1 家庭作业
题目
【问题描述】
小P为了能高效完成作业,规定每项作业花一个单位时间。
他的学习日从0时刻开始,有100000个单位时间。在任一时刻,他都可以选择编号1~N的N项作业中的任意一项作业来完成。
因为他在每个单位时间里只能做一个作业,而每项作业又有一个截止日期,所以他很难有时间完成所有N个作业,虽然还是有可能。
对于第i个作业,有一个截止时间D_i,如果他可以完成这个作业,那么他可以获得分数P_i.
在给定的作业分数和截止时间下,小P能够获得的分数最大为多少呢?答案可能会超过32位整型。
【输入格式】(homework.in)
第1行:一个整数N.
第2~N+1行:第i+1行有两个用空格分开的整数:D_i和P_i.
【输出格式】(homework.out)
输出一行,里面有一个整数,表示最大获分值。
【样例输入】
3
2 10
1 5
1 7
【样例输出】
17
【样例解释】
第1个单位时间完成第3个作业(1,7),然后在第2个单位时间完成第1个作业(2,10)以达到最大分数
【数据范围】
对于前20%的数据,1 <= N <= 100.
对于前40%的数据,1 <= N <= 1000.
对于前60%的数据,1 <= N <= 20000.
对于100%的数据,1 <= N <= 100000,
1 <= D_i <= 100000,1 <= P_i <= 1000000000
解析
很明显这是一道贪心题。
只需按分数从小到大排序,再放到离结束时间最近且未被占用的时间,之后稍微优化一下便行了。
Code
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
using namespace std;
const int N=;
int n;
long long ans;
int f[N];
struct rec{
int d,p;
}work[N];
bool cmp(rec a,rec b)
{
return a.p>b.p;
}
int find(int x)
{
if(f[x]<) return x;
return f[x]=find(f[x]);
}
int main()
{
memset(f,-,sizeof(f));
cin>>n;
for(int i=;i<=n;i++) cin>>work[i].d>>work[i].p;
sort(work+,work++n,cmp);
for(int i=;i<=n;i++)
{
int r=find(work[i].d);
if(r>) ans+=1LL*work[i].p,f[r]=r-;
}
cout<<ans;
return ;
}
T2 方程式
题目
【题目描述】
求解方程a0+a1x+a2x2+···+anxn=0。
注意:①数据保证所有根均为小于等于20的正整数。
②数据保证方程最高次项的系数为1。
③重根也要输出。
如方程1-2x+x2=0应该输出1 1。
如方程-2+5x-4x2+x3=0应该输出1 1 2。
【输入格式】
第一行一个数表示这是一个n次方程。
第二行共n+1个数,第i个数ai表示xi-1前的系数。
【输出格式】
一共n个数,从小到大依次输出方程的n个解。
【输入样例1】
2
1 -2 1
【输出样例1】
1 1
【输入样例2】
3
-2 5 -4 1
【输出样例2】
1 1 2
【数据规模】
对于30%的数据,n=2。
对于另外20%的数据,保证方程没有重根。
对于100%的数据,n<=7,ai<=109。
解析
如果没有重根的情况,直接模拟即可。
而有重根的情况,模拟多项式除法即可。
Code
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
using namespace std;
long long a[],b[],n;
long long cf(int a,int m) //乘方
{
long long sum=;
for(int i=;i<=m;i++) sum*=a;
return sum;
}
long long cal(int i)
{
int sum=;
for(int j=;j<=n;j++) sum+=a[j]*cf(i,j);
return sum;
}
int main()
{
cin>>n;
for(int i=;i<=n;i++) cin>>a[i];
for(int i=;i<=;i++)
{
while(cal(i)==)
{
memset(b,,sizeof(b));
cout<<i<<" ";
for(int j=n;j>=;j--)
if(a[j]!=&&a[j+]!=)
{
b[j]=a[j+];
a[j]+=a[j+]*i;
}
for(int j=n;j>=;j--) a[j]=b[j];
}
}
return ;
}
T3 做梦
题目
【问题描述】
Lqa的家是n层的大楼。
Lqa的电梯可以采用以下四种方式移动:
- 回到第一层。
- 向上移动a层;
- 向上移动b层;
- 向上移动c层;
现在hjy来到了Lqa的家,现在他在Lqa家的第一层,碰巧电梯也在第一层。Hjy想知道,他可以乘坐电梯前往的楼层数。
【输入格式】
第一行一个整数n,表示摩天大楼的层数。
第二行三个正整数,分别表示题目中的a,b,c。
【输出格式】
一行一个整数,表示hjy可以到达的楼层数。
【样例输入】
15
4 7 9
【样例输出】
9
【样例解释】
可以到达的楼层有:1,5,8,9,10,12,13,14,15
【数据范围】
对于20%的数据,1≤h, x, y, z≤100;
对于40%的数据,1≤h, x, y, z≤105;
对于100%的数据,1≤h≤1018,1≤x, y, z≤105。
解析
原题啊——跳楼机。
令f(i)表示仅通过操作2和操作3能达到的 mod x=i的最小楼层。
于是得出状态转移方程
f(i+y)=f(i)+y;
f(i+z)=f(i)+z。
能达到 mod x=i+y的最小楼层,即在能达到 mod x=i的最小楼层上再执行一遍操作2。
再来看一遍最短路的求法。
f(y)=f(x)+edge(i)。(y为子节点,x为父节点,edge为权值)
对比一下上面的状态转移方程,是不是很像?
于是让(i+y)与(i+z)成为点,让y,z成为权值,即可求出f(i)。
ans+=(h-f[i])/x+1;
由于f(i)是在不使用操作1的情况下,所以h和f(i)之间的差值由操作1来完成。
而每用一次操作1,就可以到达一个新楼层,所以答案就要累加上进行操作1的次数。
即(h-f[i])/x+1(因为除法是向下取整,所以答案得+1)。
Code
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <queue>
using namespace std;
const int N=1e5+;
const int INF=0x3f3f3f3f;
long long h,x,y,z;
long long f[N],ans;
bool vis[N];
int tot,ver[N*],Next[N*],edge[N*],head[N];
void add(int x,int y,int z)
{
ver[++tot]=y;
Next[tot]=head[x];
head[x]=tot;
edge[tot]=z;
}
void spfa()
{
memset(f,INF,sizeof(f));
memset(vis,,sizeof(vis));
queue<int> qwq;
qwq.push();
vis[]=;
f[]=;
while(!qwq.empty())
{
int x=qwq.front();qwq.pop();
vis[x]=;
for(int i=head[x];i;i=Next[i])
{
int y=ver[i];
if(f[y]>f[x]+edge[i])
{
f[y]=f[x]+edge[i];
if(!vis[y])
{
qwq.push(y);
vis[y]=;
}
}
}
}
} int main()
{
cin>>h>>x>>y>>z;
if(x== || y== || z==){cout<<h;return ;} //特判
for(int i=;i<x;i++)
{
//关键点
add(i,(i+y)%x,y);
add(i,(i+z)%x,z);
}
spfa();
for(int i=;i<x;i++)
if(f[i]<=h) ans+=(h-f[i])/x+; //记得+1
cout<<ans;
return ;
}
泉五培训Day3的更多相关文章
- 泉五培训Day5
T1 陪审团 题目 [题目描述] 陪审团制度历来是司法研究中的一个热议话题,由于陪审团的成员组成会对案件最终的结果产生巨大的影响,诉讼双方往往围绕陪审团由哪些人组成这一议题激烈争夺.小 W提出了一个甲 ...
- 泉五培训Day4
T1 收果子 题目 [题目描述] 有一个果园,有n棵果树依次排成一排,其中已知第 i 棵果树上结了ai个果子.现在要按照果树编号顺序依次收果子,对于一个能装v个果树的果篮,收果子从第1棵果树开始,如果 ...
- 泉五培训Day2
T1 旅游 题目 [题目描述] 幻想乡有n个景点(从1开始标号),有m条双向的道路连在景点之间,每条道路有一个人气值d,表示这条道路的拥挤程度.小G不会经过那些人气值大于x的道路,她想知道有多少对景点 ...
- 泉五培训Day1
T1 树学 题目 [问题描述] 给定一颗 n 个点的树,树边带权,试求一个排列 P,最大化下式 其中,calc(a, b)表示树上由a到b经过的最大边权. [输入格式] 第一行一个整数 n,表示点数下 ...
- 纪中2018暑假培训day3提高a组改题记录(混有部分b组)
day3 模拟赛,看了看a组题,发现是博弈论,非常开心(因为好玩),于是做的a组.结果差点爆零,死命纠结t1的sg函数,但其实只是一个dp,不用扯到sg函数的那种. t1: Description 被 ...
- 常州培训 day3 解题报告
第一题: 给出数轴正半轴上N个点的坐标和其权值,给出初始体力值M,人一开始在位置0,体力值会随着走过路程的增加而增加,走多少个单位的路消耗多少体力值.到每个点可以打掉,消耗的体力值就是其权值.求 最多 ...
- 正睿暑期培训day3考试
链接 A 可以发现一个小棍的贡献是使得左右两列上的球位置互换.所以只要找出哪两个球会经过当前位置,然后swap一下就行了.. 考场上调了2.5h,依然没过样例.赛后发现忘了排序!!!!... /* * ...
- 长乐培训Day3
T1 奶牛晒衣服 题目 [题目描述] 在熊大妈英明的带领下,时针和他的同伴生下了许多牛宝宝.熊大妈决定给每个宝宝都穿上可爱的婴儿装.于是,为牛宝宝洗晒衣服就成了很不爽的事情. 圣人王担负起了这个重任. ...
- 8月清北学堂培训 Day3
今天是赵和旭老师的讲授~ 状态压缩 dp 状态压缩是设计 dp 状态的一种方式. 当普通的 dp 状态维数很多(或者说维数与输入数据有关),但每一维总量很少时,可以将多维状态压缩为一维来记录. 这种题 ...
随机推荐
- LeetCode 110.平衡二叉树(C++)
给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1. 示例 1: 给定二叉树 [3,9,20,null,nu ...
- git 基础教程
git 提交 全部文件 git add . git add xx命令可以将xx文件添加到暂存区,如果有很多改动可以通过 git add -A .来一次添加所有改变的文件.注意 -A 选项后面还有一个 ...
- btfs
以下都是举例说明: A. 使用fdisk命令对/dev/sdb进行分区 B. 先对/dev/sdb5和/dev/sdb6进行格式化, 文件系统为btrfs C. 使用btrfs filesystem ...
- Unity C# 用枚举(enum)制作复选框
最近在项目中做测试脚本用到一些布尔值做方法的开关,突然想到可以制作一个复选框控制开关. 首先搜集网上的资料,基本大同小异,这里就不多做解释了,代码附上: public class EnumFlagsA ...
- java实现新旧版本号比较
项目中需要使用比较现在线上版本和新版本,然后新版本执行新方法,方法如下: /** * * @方法名称:comparaVersion * @内容摘要: <版本比较> * @param old ...
- ThinkPHP报Class 'Core\Log' not found竟然是由这个原因导致的
项目在开发阶段运行的好好的(Debug=true),上线后(Debug=false)其中有一个页面报“对不起,您的页面暂进无法找到!”错误.摸不清头脑,看看了这个页面也没有什么两样,可就是提示这句话, ...
- 一个ActionResult中定位到两个视图—<团委项目>
在使用MVC做项目的时候一般的情况就是一个ActionResult一个视图,这样对应的Return View();就可以找到下面对应的视图,这是根据一个原则,“约定大于配置”,但是我们有的时候需要在一 ...
- jquery拖拽排序,针对后台列表table进行拖拽排序(超实用!)
现在很多后台列表为了方便均使用拖拽排序的功能,对列表进行随意的排序. 话不多说 ,我在网上找了一些demo,经过对比,现在把方便实用的一个demo列出来,基于jqueryUI.js 先上html代码, ...
- cf1059D. Nature Reserve(三分)
题意 题目链接 Sol 欲哭无泪啊qwq....昨晚一定是智息了qwq 说一个和标算不一样做法吧.. 显然\(x\)轴是可以三分的,半径是可以二分的. 恭喜你获得了一个TLE的做法.. 然后第二维的二 ...
- c语言 Implement strStr()【Leetcode】
实现在一个母字符串中找到第一个子字符串的位置. #include <stdio.h> #include <string.h> #define _IRON_TRUE 1 #def ...