终于考完了
----
诶--- --- ---
1.7
cf500c
http://codeforces.com/problemset/problem/500/C
补去年的题了......
懒成狗了......
给出 n 本书的重量,m 天,还有这m 天每天要看哪一本书,然后每次看一本书的时候,是将这本书上面的书拿走,再拿走要看的书,再把挪走的那一摞书放回来
确定书最开始的顺序,使得搬的书的重量最小
按照看书的先后顺序来放,没有出现过的书就不管
假设现在要看的书是 x ,它的上面有 m 这么重的书
现在需要搬 m
如果不是按照看书的顺序来放的放,假设现在有一个m0在x 的上面
现在需要搬动 m + m0 > m
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 7 const int maxn = 1005; 8 int a[maxn],w[maxn]; 9 int n,m; 10 int b[maxn],vis[maxn]; 11 int c[maxn]; 12 13 void solve(){ 14 int cnt = 0; 15 memset(vis,0,sizeof(vis)); 16 memset(c,0,sizeof(c)); 17 for(int i = 1;i <= m;i++){ 18 if(!vis[a[i]]){ 19 b[++cnt] = a[i]; 20 vis[a[i]] = 1; 21 } 22 } 23 24 /* for(int i = 1;i <= cnt;i++){ 25 printf("b[%d] = %d\n",i,b[i]); 26 }*/ 27 28 int ans = 0; 29 for(int i = 1;i <= m;i++){ 30 int pos = 0; 31 for(int j = 1;j <= cnt;j++){ 32 if(b[j] == a[i]) { 33 pos = j; 34 break; 35 } 36 ans += w[b[j]]; 37 // printf("--- i = %d b[%d] = %d\n",i,j,b[j]); 38 } 39 memcpy(c,b,sizeof(b)); 40 for(int j = 1;j < pos;j++){ 41 b[j+1] = c[j]; 42 } 43 b[1] = a[i]; 44 45 /* for(int j = 1;j <= cnt;j++){ 46 printf(" %d ",b[j]); 47 } 48 printf("\n");*/ 49 } 50 printf("%d\n",ans); 51 } 52 53 int main(){ 54 while(scanf("%d %d",&n,&m) != EOF){ 55 for(int i = 1;i <= n;i++) scanf("%d",&w[i]); 56 for(int i = 1;i <= m;i++) scanf("%d",&a[i]); 57 solve(); 58 } 59 return 0; 60 }
时间: 2024-10-07 05:50:04