您的位置:首页 > 其它

10.11 noip模拟试题

2016-10-11 14:29 183 查看
4题均为128M1s

1. 锻炼计划(exercise.pas)

身体是革命的本钱,OIers不要因为紧张的学习和整天在电脑前而忽视了健康问题。小x设计了自己的锻炼计划,但他不知道这个计划是否可行,换句话说如果计划不当可能会让他的体力超支,所以小x请你帮助他。

一天有1440分钟,所以小x列出的是这一整天第1至第1440分钟的计划。小x的体力用一个整数来表示,他会按照计划表进行锻炼,同时,每分钟小x的体力会自动增加1。如果某一分钟末小x的体力小于等于零,那么可怜的小x就累死了……

输入(exercise.in)

第一行是用空格分开的两个整数n,m,分别表示小x的初始体力值和计划的项目数量。

从第二行开始的m行,每行描述一个锻炼项目:名称、开始时间a、结束时间b、每分钟耗费的体力(用空格分隔),表示此项目从第a分钟初开始,第b分钟末结束。锻炼项目按照开始时间递增顺序给出,不会出现两个项目时间冲突的情况。

输出(exercise.out)

输出包括两行,如果计划可行,第一行输出"Accepted",第二行输出这一天过后最后剩余的体力;否则在第一行输出"Runtime Error",第二行输出在第几分钟累死。

样例

Input

Output

10 1

Basketball 1 10 1

Accepted

1440

1 1

Nunchakus 1 1 2

Runtime Error

1

约定

0<n<=2^31-1

0<=m<=500

所有中间值的绝对值不会超过2^31-1

每一个锻炼项目的名称不超过20个字符,其中不含空格。

XXX偷懒用读入优化无视字符没想到字符里面由数字QAQ

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define maxn 5010
using namespace std;
int n,m,f[maxn][maxn/10],p[maxn],path[maxn];
vector<int>c[maxn],v[maxn];
int init(){
int x=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
return x*f;
}
void Dfs(int x,int y){
if(x<=0)return;
for(int i=0;i<=p[x];i++)
if(f[x][y]==f[x-1][y-c[x][i]]+v[x][i]){
path[x]=i+1;Dfs(x-1,y-c[x][i]);
}
}
int main()
{
freopen("diablo.in","r",stdin);
freopen("diablo.out","w",stdout);
n=init();m=init();
int ci,vi;
for(int i=1;i<=n;i++){
ci=init();p[i]=init();
for(int j=1;j<=p[i];j++){
vi=init();
c[i].push_back(ci*j);
v[i].push_back(vi);
}
c[i].push_back(0);
v[i].push_back(0);
}
for(int i=1;i<=n;i++)
for(int j=m;j>=0;j--){
int s=c[i].size();
f[i][j]=f[i-1][j];
for(int k=0;k<s;k++)
if(j>=c[i][k])
f[i][j]=max(f[i][j],f[i-1][j-c[i][k]]+v[i][k]);
}
printf("%d\n",f
[m]);
Dfs(n,m);
for(int i=1;i<=n;i++)
printf("%d\n",path[i]%(p[i]+1));
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: