#24742: 把切割的位置點做排序


abs71507@gmail.com (46 5)

學校 : 國立中興大學
編號 : 87742
來源 : [36.235.200.136]
最後登入時間 :
2023-05-24 14:06:42
f607. 3. 切割費用 -- 2021年1月APCS | From: [42.73.148.113] | 發表日期 : 2021-03-19 21:49

以範例測資來說

2 2 //第2刀切在2
3 1 //第1刀切在3
5 3 //第3刀切在5
先將這些資料以結構(struct)來儲存
例如
struct L
{

}
把切割的位置點做排序後

 
#24746: Re:把切割的位置點做排序


abs71507@gmail.com (46 5)

學校 : 國立中興大學
編號 : 87742
來源 : [36.235.200.136]
最後登入時間 :
2023-05-24 14:06:42
f607. 3. 切割費用 -- 2021年1月APCS | From: [42.73.148.113] | 發表日期 : 2021-03-19 22:24

上篇不小心按到提交==

這篇繼續

以範例測資來說

2 2 //第2刀切在2
3 1 //第1刀切在3
5 3 //第3刀切在5
先將這些資料以結構(struct)來儲存
例如
struct L
{
int ID;//儲存數字的先後順序
int site;//儲存切割點位置
}
接下來在主程式裡動態規劃L所需的空間
以這個測資而言
共有3份資料
因此可以宣告為
L *X=new L[3];//宣告3份L型態的空間 名稱為X

再引用C++能用來排序的標頭檔
#include <algorithm>
然而我們要排的是自定義的型態(L)
因此要自訂義排序的函數
bool cmp(L a,L b)
{
return a.site<b.site;//把資料一切割點排序 數字小的在前面
}
把切割的位置點做排序後
就可以來計算長度了
for (int i = 0; i < X; i++)//由最小的切割位置開始 { now = stick[i].ID;把當前的切割順序記下來 over_min = Y;紀錄大於當前的最小切割點 並且預設為心按到提交==
 
這篇繼續
 
以範例測資來說
 
2 2 //第2刀切在2
3 1 //第1刀切在3
5 3 //第3刀切在5
先將這些資料以結構(struct)來儲存
例如 
struct L
{
  int ID;//儲存數字的先後順序
  int site;//儲存切割點位置
}
接下來在主程式裡動態規劃L所需的空間
以這個測資而言
共有3份資料
因此可以宣告為
L *X=new L[3];//宣告3份L型態的空間 名稱為X
 
再引用C++能用來排序的標頭檔
#include <algorithm>
然而我們要排的是自定義的型態(L)
因此要自訂義排序的函數
bool cmp(L a,L b)
{
  return a.site<b.site;//把資料一切割點排序 數字小的在前面 
}
把切割的位置點做排序後
就可以來計算長度了
長度是由離自己最近的兩個方向的切割點的差加總而來
for (int i = 0; i < X; i++)//由最小的切割位置開始
{
  now = stick[i].ID;把當前的切割順序記下來
  over_min = 木棒長度;//紀錄大於當前的最小切割點 並且預設為最大值 
  under_max=0;//紀錄小於當前的最大切割點 並且預設為最小值 
/*
以12345來說
假設當前為3
那麼
over_min=4
under_max=2
而預設值是為了 當沒有其他切割點大於或小於當前時
預設為木棒的起始位置(0)和終止位置
*/ for (int j = i - 1; j >= 0; j--)//因為已經排序好的緣故 因此要找比當前小的最大切割點只須往前找 只要符合資格就是我們要的under_max { if (stick[j].ID < now)//now紀錄當前的順序 因此要和其他刀的順序比較 如果當前順序大於找到的切割點順序 代表找到的切割點在當前之前就已存在 { under_max = stick[j].site; break;//找到即可跳出 } } for (int j = i + 1; j < X; j++)//概念同上 { if (stick[j].ID < now) { over_min = stick[j].site; break; } }
Sum+=over_min - under_max;//大-小即為長度
}



 
#24747: Re:把切割的位置點做排序


abs71507@gmail.com (46 5)

學校 : 國立中興大學
編號 : 87742
來源 : [36.235.200.136]
最後登入時間 :
2023-05-24 14:06:42
f607. 3. 切割費用 -- 2021年1月APCS | From: [42.73.148.113] | 發表日期 : 2021-03-19 22:28

我覺得這提交的功能怪怪的...

算了我整理一下

 

以範例測資來說
 
2 2 //第2刀切在2
3 1 //第1刀切在3
5 3 //第3刀切在5
先將這些資料以結構(struct)來儲存
例如 
struct L
{
  int ID;//儲存數字的先後順序
  int site;//儲存切割點位置
}
接下來在主程式裡動態規劃L所需的空間
以這個測資而言
共有3份資料
因此可以宣告為
L *X=new L[3];//宣告3份L型態的空間 名稱為X
 
再引用C++能用來排序的標頭檔
#include <algorithm>
然而我們要排的是自定義的型態(L)
因此要自訂義排序的函數
bool cmp(L a,L b)
{
  return a.site<b.site;//把資料一切割點排序 數字小的在前面 
}
把切割的位置點做排序後
就可以來計算長度了
長度是由離自己最近的兩個方向的切割點的差加總而來
for (int i = 0; i < X; i++)//由最小的切割位置開始
{
  now = stick[i].ID;把當前的切割順序記下來
  over_min = 木棒長度;//紀錄大於當前的最小切割點 並且預設為最大值 
  under_max=0;//紀錄小於當前的最大切割點 並且預設為最小值 
/*
以12345來說
假設當前為3
那麼
over_min=4
under_max=2
而預設值是為了 當沒有其他切割點大於或小於當前時
預設為木棒的起始位置(0)和終止位置
*/ for (int j = i - 1; j >= 0; j--)//因為已經排序好的緣故 因此要找比當前小的最大切割點只須往前找 只要符合資格就是我們要的under_max { if (stick[j].ID < now)//now紀錄當前的順序 因此要和其他刀的順序比較 如果當前順序大於找到的切割點順序 代表找到的切割點在當前之前就已存在 { under_max = stick[j].site; break;//找到即可跳出 } } for (int j = i + 1; j < X; j++)//概念同上 { if (stick[j].ID < now) { over_min = stick[j].site; break; } }
Sum+=over_min - under_max;//大-小即為長度
}
 
ZeroJudge Forum