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. Vertex And Fragment Shader(顶点和片段着色器)

    Vertex And Fragment Shader(顶点和片段着色器) Shader "Unlit/ Vertex­_And_Fragment_Shader " { Proper ...

  2. [转]AngularJS+UI Router(1) 多步表单

    本文转自:https://www.zybuluo.com/dreamapplehappy/note/54448 多步表单的实现   在线demo演示地址https://rawgit.com/dream ...

  3. thinkphp3.2.3 ueditor1.4.3 图片上传操作,在线删除上传图片功能。

    最近弄一个图片 上传,可是用ueditor 自带的上传,如果不配置的话,上传的目录不在自己的项目中. 在网上找了好多,可是都是底版本的,新版本的还真是找到了一个,ueditor-thinkphp 这个 ...

  4. (转)Nagios 配置及监控

    Nagios 配置及监控 原文:http://blog.csdn.net/linuxlsq/article/details/52606824 Nagios 监控 在互联网日益发展的今天,监控的重要性已 ...

  5. 利用nginx的fastcgi_cache模块来做缓存

    nginx不仅有个大家很熟悉的缓存代理后端内容的proxy_cache,还有个被很多人忽视的fastcgi_cache. proxy_cache的作用是缓存后端服务器的内容,可能是任何内容,包括静态的 ...

  6. 【转】Android 中的 Service 全面总结

    1.Service的种类   按运行地点分类: 类别 区别  优点 缺点   应用 本地服务(Local) 该服务依附在主进程上,  服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另 ...

  7. AngularJS directive 动态 template

    app.directive('testwindow', function() { return { restrict : 'E', template: '<ng-include src=&quo ...

  8. python面试题——前端(23题)

    2.谈谈你对websocket协议的认识. 3.什么是magic string ? 4.如何创建响应式布局? 5.你曾经使用过哪些前端框架? 6.什么是ajax请求?并使用jQuery和XMLHttp ...

  9. MySQL(三) 完整性约束

    一.介绍 约束条件与数据类型的宽度意义,都是可选参数. 作用:用于保证数据的完整性和一致性. 主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN ...

  10. Differences or similarities between Java and C++

    “作为一名C++程序员,我们早已掌握了面向对象Object-oriented Programming程序设计的基本概念,而且Java的语法无疑是非常熟悉的.事实上,Java本来就是从C++衍生出来的. ...