标签:cout style 格式 接收 访问 从后往前 i+1 img inf
尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成。
尼克的一个工作日为N分钟,从第一分钟开始到第N分钟结束。当尼克到达单位后他就开始干活。如果在同一时刻有多个任务需要完戍,尼克可以任选其中的一个来做,而其余的则由他的同事完成,反之如果只有一个任务,则该任务必需由尼克去完成,假如某些任务开始时刻尼克正在工作,则这些任务也由尼克的同事完成。如果某任务于第P分钟开始,持续时间为T分钟,则该任务将在第P+T-1分钟结束。
写一个程序计算尼克应该如何选取任务,才能获得最大的空暇时间。
输入格式:
输入数据第一行含两个用空格隔开的整数N和K(1≤N≤10000,1≤K≤10000),N表示尼克的工作时间,单位为分钟,K表示任务总数。
接下来共有K行,每一行有两个用空格隔开的整数P和T,表示该任务从第P分钟开始,持续时间为T分钟,其中1≤P≤N,1≤P+T-1≤N。
输出格式:
输出文件仅一行,包含一个整数,表示尼克可能获得的最大空暇时间。
15 6 1 2 1 6 4 11 8 5 8 1 11 5
4
由后面状态更新前面状态的DP。
(填表法和刷表法)
设计状态f【i】表示在i~T(T为总时间)的时间内的最大闲暇时间
状态转移方程:
如果时间点i处没有任务,则f【i】= f【i+1】+1;
如果时间点i处有任务,则f【i】=max(f【i+任务k的持续时间】); //此处k = 1~时间点i处的任务总个数
所以很容易发现,想要知道f【i】,必须先求出 f【比i大的时间点】,所以确定本题倒推:由f【T】递推到f【1】。
那么如何记录下 时间点i处的每个任务的信息呢,直接将“任务(开始时间、持续时间)”定义成结构体。输入完毕后,以每个任务的开始时间为关键字 从大到小排序。这样就使得 开始时间相同的任务 靠到了一起,并且接下来dp时直接从下标1开始做,就保证了倒推(时间从后往前,因为排过序)。
1 #include <bits/stdc++.h> 2 const int INFINITE=0x3fffffff; 3 const int MAXN=1e4+10; 4 using namespace std; 5 struct taskNode{ 6 int s;//start 7 int l;//last 8 taskNode(int s,int l){ 9 this->s=s; 10 this->l=l; 11 } 12 taskNode(){} 13 bool operator <(const taskNode &p1) const{ 14 if(this->s==p1.s) return this->l>p1.l; 15 return this->s>p1.s; 16 } 17 }task[MAXN];//写了有参构造函数之后,空构造函数没有了 18 int f[MAXN],sch[MAXN]; 19 int t,n; 20 21 void print(); 22 void init(){ 23 cin>>t>>n; 24 for(int i=1;i<=n;i++){ 25 cin>>task[i].s>>task[i].l; 26 sch[task[i].s]++; 27 } 28 sort(task+1,task+n+1); 29 } 30 31 void dp(){ 32 memset(f,0,sizeof(f)); 33 for(int i=t,now=1;i>=1;i--){ 34 if(sch[i]==0) f[i]=f[i+1]+1; 35 else for(int j=1;j<=sch[i];j++,now++){ 36 f[i]=max(f[i],f[i+task[now].l]); 37 } 38 } 39 } 40 41 int main(){ 42 //freopen("in.txt","r",stdin); 43 init(); 44 45 dp(); 46 //print(); 47 cout<<f[1]<<endl; 48 return 0; 49 } 50 void print(){ 51 for(int i=1;i<=n;i++){ 52 cout<<task[i].s<<" "<<task[i].l<<endl; 53 } 54 cout<<endl; 55 for(int i=1;i<=t;i++){ 56 cout<<f[i]<<" "; 57 } 58 cout<<endl; 59 }
关于上面代码说几点:
1、第17行 }task[MAXN]; 这样是以无参构造函数初始化了MAXN个变量,已经new出来了。
写了有参构造函数之后,空构造函数没有了 ,所以写了构造函数没写无参,这里会发生错误
2、第2,3行常量的定义
3、now这个变量是为了task从上访问到下,所以这是方式可以记一下,很多位置都会用到
4、变量在知道意思的情况下尽量写的简单点吧
标签:cout style 格式 接收 访问 从后往前 i+1 img inf
原文地址:http://www.cnblogs.com/Renyi-Fan/p/7535289.html