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的电梯可以采用以下四种方式移动:

  1. 回到第一层。
  2. 向上移动a层;
  3. 向上移动b层;
  4. 向上移动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的更多相关文章

  1. 泉五培训Day5

    T1 陪审团 题目 [题目描述] 陪审团制度历来是司法研究中的一个热议话题,由于陪审团的成员组成会对案件最终的结果产生巨大的影响,诉讼双方往往围绕陪审团由哪些人组成这一议题激烈争夺.小 W提出了一个甲 ...

  2. 泉五培训Day4

    T1 收果子 题目 [题目描述] 有一个果园,有n棵果树依次排成一排,其中已知第 i 棵果树上结了ai个果子.现在要按照果树编号顺序依次收果子,对于一个能装v个果树的果篮,收果子从第1棵果树开始,如果 ...

  3. 泉五培训Day2

    T1 旅游 题目 [题目描述] 幻想乡有n个景点(从1开始标号),有m条双向的道路连在景点之间,每条道路有一个人气值d,表示这条道路的拥挤程度.小G不会经过那些人气值大于x的道路,她想知道有多少对景点 ...

  4. 泉五培训Day1

    T1 树学 题目 [问题描述] 给定一颗 n 个点的树,树边带权,试求一个排列 P,最大化下式 其中,calc(a, b)表示树上由a到b经过的最大边权. [输入格式] 第一行一个整数 n,表示点数下 ...

  5. 纪中2018暑假培训day3提高a组改题记录(混有部分b组)

    day3 模拟赛,看了看a组题,发现是博弈论,非常开心(因为好玩),于是做的a组.结果差点爆零,死命纠结t1的sg函数,但其实只是一个dp,不用扯到sg函数的那种. t1: Description 被 ...

  6. 常州培训 day3 解题报告

    第一题: 给出数轴正半轴上N个点的坐标和其权值,给出初始体力值M,人一开始在位置0,体力值会随着走过路程的增加而增加,走多少个单位的路消耗多少体力值.到每个点可以打掉,消耗的体力值就是其权值.求 最多 ...

  7. 正睿暑期培训day3考试

    链接 A 可以发现一个小棍的贡献是使得左右两列上的球位置互换.所以只要找出哪两个球会经过当前位置,然后swap一下就行了.. 考场上调了2.5h,依然没过样例.赛后发现忘了排序!!!!... /* * ...

  8. 长乐培训Day3

    T1 奶牛晒衣服 题目 [题目描述] 在熊大妈英明的带领下,时针和他的同伴生下了许多牛宝宝.熊大妈决定给每个宝宝都穿上可爱的婴儿装.于是,为牛宝宝洗晒衣服就成了很不爽的事情. 圣人王担负起了这个重任. ...

  9. 8月清北学堂培训 Day3

    今天是赵和旭老师的讲授~ 状态压缩 dp 状态压缩是设计 dp 状态的一种方式. 当普通的 dp 状态维数很多(或者说维数与输入数据有关),但每一维总量很少时,可以将多维状态压缩为一维来记录. 这种题 ...

随机推荐

  1. (转)IBM AIX系统硬件信息查看命令(shell脚本)

    IBM AIX系统硬件信息查看命令(shell脚本) 原文:http://blog.itpub.net/22085031/viewspace-1054015/ 查看IBM AIX系统的主机型号.序列号 ...

  2. [API]API运用实例

    首先,在百度API:http://apistore.baidu.com/查找自己想用的api接口,例如:翻译: 利用postman工具进行测试: 返回结果为JSON字符串: { "errNu ...

  3. Docker学习笔记(2)-docker镜像操作

    本节将会涉及Docker的镜像操作. 1. 获取镜像 如何获取Docker Hub上的镜像?可通过docker pull命令获取,其格式为: docker pull [选项] [Docker Regi ...

  4. 基础10 多进程、协程(multiprocessing、greenlet、gevent、gevent.monkey、select、selector)

    1.多进程实现方式(类似于多线程) import multiprocessing import time,threading def thread_run():#定义一个线程函数 print(&quo ...

  5. 使用js调用摄像头拍照

    在一些浏览器里已经可以使用web api调用摄像头功能了. 基于此可以经行拍照摄像功能,网上找了些资料,然后实现了简单的拍照功能 演示地址 bingxl.cn/webrtc.html 代码 <! ...

  6. 小程序 页面到详情的id传递

    比如电影列表页跳转到电影详情页 在movie.js获取movieId; processDoubanData: function (moviesDouban, settedKey, categoryTi ...

  7. HttpClient4.3.3 禁止自动重定向

    HttpClient4.3中默认允许自动重定向,导致程序中不能跟踪跳转情况,其实只需要在RequestConfig中setRedirectsEnabled(false)即可(默认是true): pri ...

  8. 你真的了解 advice, joinpoint,pointcut,aspect吗?

    假设我们有一个很普通的Employee类,在某些方法被调用时,这个类里的方法也被调用. class Employee{ public String getName(int id){....} priv ...

  9. Hibernate课程 初探一对多映射4-1 inverse属性

    1 <Set>节点的inverse属性默认由one方来维护(默认值为false).将inverse属性修改为true则由多方来维护.

  10. struts 上传文件 Dynavalidatorform 实例

    一.相关jar包     一个空struts工程的jar包:    另上传文件的两个jar包: 二.页面 1.上传页面upload.jsp <%@ page language="jav ...