日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

POJ 1033--Defragment

發布時間:2024/3/13 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ 1033--Defragment 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意

題目大意是在磁盤上有若干個cluster的數據,分別在不同位置,現在需要整合這些數據.

input:

20 3
4 2 3 11 12
1 7
3 18 5 10

表示在cluster 2, 3, 11, 12, 7, 18, 5, 10的位置有數據,要求通過復制這些數據,使得磁盤前面沒有空閑的部分,并且不能改變這些數據的相對順序.

output:

2 1 (cluster2處的數據復制到cluster1)
3 2
11 3
12 4
18 6
10 8
5 20
7 5
20 7

分析

  • 要保證數據不丟失,在復制的時候,目標位置需要是空閑的.假設有3個cluster的數據,c1的目標位置在c2, c2的目標位置在c3,c3的目標位置是空白.那么對于c1通過深度搜索就能找到空白位置,依次復制c3,c2,c1即可.
  • 可能出現的情況是成環,比如c3的目標位置在c1處,那么只需要把c1先復制到其余的任一空白處,然后復制c3,c2,最后是c1.

代碼如下:
Memory: 1404K Time: 797MS Length: 70LINES

#include <cstring> #include <iostream> using namespace std;int rear = 0; void search(int* clusters, bool* flag, int max_cluster, int idx) {if (flag[clusters[idx]]) {for (int i = max_cluster; i > 0; --i) {if (clusters[i] == 0) {cout << idx << " " << i << endl;clusters[i] = clusters[idx];clusters[idx] = 0;rear = i;return;}}}if (clusters[clusters[idx]] != 0) {flag[idx] = true;search(clusters, flag, max_cluster, clusters[idx]);}cout << idx << " " << clusters[idx] << endl;clusters[clusters[idx]] = clusters[idx];clusters[idx] = 0;flag[idx] = false; }int main() {int max_cluster = 0;int files = 0;cin >> max_cluster >> files;int* clusters = new int[max_cluster + 1];memset(clusters, 0, sizeof(int) * (max_cluster + 1));bool* flag = new bool[max_cluster + 1];memset(flag, 0, sizeof(bool) * (max_cluster + 1));int cnt = 0;int right = 0;int cluster_idx = 0;for (int i = 0; i < files; ++i) {cin >> cnt;for (int j = 0; j < cnt; ++j) {int src = 0;cin >> src;clusters[src] = ++cluster_idx;if (src == cluster_idx) {++right;}}}if (right == cluster_idx) {cout << "No optimization needed" << endl;} else {for (int i = 1; i < max_cluster + 1; ++i) {if (clusters[i] != 0 && clusters[i] != i) {search(clusters, flag, max_cluster, i);if (rear) {cout << rear << " " << clusters[rear] << endl;clusters[clusters[rear]] = clusters[rear];clusters[rear] = 0;rear = 0;}}}}delete[] clusters;delete[] flag;return 0; }

總結

以上是生活随笔為你收集整理的POJ 1033--Defragment的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。