(模拟赛)阅读计划
2017-08-19 10:35
274 查看
暑假到了,Rick制定了一个长达M天的阅读计划。他一共有N本书,从1至N进行标号;Rick将它们从上至下摞成一堆。他每天都会读一本书,假设他要读编号为X的书,他会按照以下步骤:
1. 将这本书上方的所有书搬起来
2. 将这本书拿出来
3. 将搬起来的书摞回去
4. 看完后把这本书放到顶端
每本书都会有各自的重量,Rick不希望搬起太过重的书。于是他希望能重新安排这N本书的顺序,使得读完M本书之后,搬书的重量之和最小。
输入格式(book.in)
第一行两个整数N与M,分别代表书的数量和阅读的天数。
第二行N个整数,代表每本书的重量。
第三行M个整数,代表每天要读的书的编号。
输出格式(book.out)
一行一个整数,代表最小的重量之和。
样例输入
3 5
1 2 3
1 3 2 3 1
样例输出
12
样例解释
DAY1 : 1 3 2 – 搬起重量 = 0
DAY2 : 1 32 – 搬起重量 = 1
DAY3 : 3 1 2 – 搬起重量 = 4
DAY4 : 2 3 1 – 搬起重量 = 2
DAY5 : 3 2 1 – 搬起重量 = 5
总和 = 0 + 1 + 4 + 2 + 5 = 12
数据范围与约束
对于30%的数据,N<=10.
对于100%的数据,2<=N<=500, 1<=M<=1000, 每本书重量不超过100.
这题要用到oi竞赛中常用的思考模式——由少到多
只有1本书时,直接放在最上面
两本呢?按照阅读顺序放
三本呢?也是如此
因为每阅读一本书,对于该本书而言,他的贡献为上面所有书的重量。但无论他在哪个位置,对后面所有书的贡献都是一样的。因为他将被放在最上面
所以按阅读顺序排序,再模拟一遍就好了
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<list>
#define For(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
const int N=1000+5;
int w
,t
,in
;
int n,m;
list <int >q;
list <int >::iterator it;
inline int read(){
char c=getchar();
while(c<'0'||c>'9')c=getchar();
int x=c-'0';
c=getchar();
while(c<='9'&&c>='0'){x=x*10+c-'0';c=getchar();}
return x;
}
int ans=0;
int main(){
freopen("book.in","r",stdin);
freopen("book.out","w",stdout);
n=read();m=read();
For(i,1,n)w[i]=read();
For(i,1,m)t[i]=read();
For(i,1,m){
if(!in[t[i]]){q.push_back(t[i]);in[t[i]]=1;}
}
For(i,1,m){
for(it=q.begin();it!=q.end();it++){
if(*it==t[i])break;
ans+=w[*it];
}
q.erase(it);
q.push_front(t[i]);
}
cout<<ans;
return 0;
}
1. 将这本书上方的所有书搬起来
2. 将这本书拿出来
3. 将搬起来的书摞回去
4. 看完后把这本书放到顶端
每本书都会有各自的重量,Rick不希望搬起太过重的书。于是他希望能重新安排这N本书的顺序,使得读完M本书之后,搬书的重量之和最小。
输入格式(book.in)
第一行两个整数N与M,分别代表书的数量和阅读的天数。
第二行N个整数,代表每本书的重量。
第三行M个整数,代表每天要读的书的编号。
输出格式(book.out)
一行一个整数,代表最小的重量之和。
样例输入
3 5
1 2 3
1 3 2 3 1
样例输出
12
样例解释
DAY1 : 1 3 2 – 搬起重量 = 0
DAY2 : 1 32 – 搬起重量 = 1
DAY3 : 3 1 2 – 搬起重量 = 4
DAY4 : 2 3 1 – 搬起重量 = 2
DAY5 : 3 2 1 – 搬起重量 = 5
总和 = 0 + 1 + 4 + 2 + 5 = 12
数据范围与约束
对于30%的数据,N<=10.
对于100%的数据,2<=N<=500, 1<=M<=1000, 每本书重量不超过100.
这题要用到oi竞赛中常用的思考模式——由少到多
只有1本书时,直接放在最上面
两本呢?按照阅读顺序放
三本呢?也是如此
因为每阅读一本书,对于该本书而言,他的贡献为上面所有书的重量。但无论他在哪个位置,对后面所有书的贡献都是一样的。因为他将被放在最上面
所以按阅读顺序排序,再模拟一遍就好了
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<list>
#define For(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
const int N=1000+5;
int w
,t
,in
;
int n,m;
list <int >q;
list <int >::iterator it;
inline int read(){
char c=getchar();
while(c<'0'||c>'9')c=getchar();
int x=c-'0';
c=getchar();
while(c<='9'&&c>='0'){x=x*10+c-'0';c=getchar();}
return x;
}
int ans=0;
int main(){
freopen("book.in","r",stdin);
freopen("book.out","w",stdout);
n=read();m=read();
For(i,1,n)w[i]=read();
For(i,1,m)t[i]=read();
For(i,1,m){
if(!in[t[i]]){q.push_back(t[i]);in[t[i]]=1;}
}
For(i,1,m){
for(it=q.begin();it!=q.end();it++){
if(*it==t[i])break;
ans+=w[*it];
}
q.erase(it);
q.push_front(t[i]);
}
cout<<ans;
return 0;
}
相关文章推荐
- <汇编语言(第2版)>阅读计划
- 淘宝数据库OceanBase SQL编译器部分 源码阅读--生成物理查询计划
- 瓣数字阅读计划上线 作者可直接获取收益
- 本学期的阅读计划与快速阅读《构建之法》后提出问题
- 阅读计划
- 阅读计划
- 2014年编程学习阅读计划
- 《梦断代码》阅读计划
- 阅读《梦断代码》计划
- 阅读计计计计计计划
- 2016年秋季个人阅读计划
- 2016年秋季个人阅读计划
- 阅读计划
- VLC 学习计划---文档阅读
- 设计模式阅读计划<Design Patterns.pdf,eng>
- 阅读计划(book)
- VLC 学习计划---(1)文档阅读
- <SQL语言艺术>阅读计划
- 2015年秋季个人阅读计划
- 2015年秋季阅读计划