Sandglass(模擬分段函式)

2021-08-21 21:23:53 字數 1318 閱讀 4610

時間限制: 1 sec  記憶體限制: 128 mb

提交: 244  解決: 44

[提交] [狀態] [討論版] [命題人:admin]

題目描述

樣例輸入

180

360 120 180

330 90

61 1

180 180

樣例輸出

60

1120

給你乙個沙漏,告訴你沙漏裡有多少沙子(同時這也是沙漏的上部分或下部分的容積),然後告訴你會進行k次翻轉的時刻點(遞增)

q次詢問,問在初始值為ai的時候第t秒a部分(最開始是上半部分)裡沙子的質量(t遞增)

一開始覺得很簡單,覺得可以模擬但可能超時,然後就寫了下面這個**,果然超時

#includeusing namespace std;

int tim[100005];

int ans[100005];

int main()

ai = ai+flag*(t-tim[j-1]);

if(ai>x)

ai=x;

if(ai<0)

ai=0;

printf("%d\n",ai);

}return 0;

}

但是實際上應該這樣想,可以模擬t秒時a部分所有的ai初始值的情況(也就是0---x),這樣每次詢問的時候再考慮這次輸入的ai就可以了(因為詢問的時間依次遞增)

那麼實際上可以得到一條曲線設x軸為ai的初始值,y軸為t秒後的a部分裡的沙子質量,那麼,

一開始,曲線就是個正比例函式(並且斜率是1),每過一秒,曲線向下(上 )平移乙個單位,注意

移動後不能小於零,不能大於x,這樣最多變成乙個三段的分段函式,那麼維護兩個分界點即可

add是如果什麼都不考慮,原影象的平移量,那麼加上ai再mix(我寫的乙個函式,用來限制範圍)一下就得到了當前的值,

因為t不一定是恰好在翻轉點,那麼要加上flag*(t-tim[j-1]),再限制在0----x之間就是答案了

#includeusing namespace std;

int tim[100005];

int x,k,q;

int mix(int t,int l = 0,int r = x)

int main()

ai = mix(flag*(t-tim[j-1])+mix(ai+add,low,up));

printf("%d\n",ai);

}return 0;

}

分段函式求值

上機內容 用if else語句求解分段函式。上機目的 學會分支結構程式設計。作 者 李洋 完成日期 2012 年 10月 23日 版 本 號 v1.0 輸入描述 x,x為非負數。問題描述 求以x為自變數的分段函式的值。程式輸出 y的值。問題分析 略 演算法設計 輸入x後,判斷是否為非負數。當是非負數...

分段函式求值

上機內容 用if elsse語句和switch語句求解分段函式 上機目的 學會分支結構程式設計 作 者 李全港 完成日期 2012 年 10月22 日 版 本 號 v1.0 輸入描述 x x 為非負數 問題描述 求以 x 為自變數的分段函式的值,y x 0 x 2 y x 2 2 2 x 6 y x...

分段函式(彙編)

第一次寫彙編,兩天從一臉蒙蔽到硬著頭皮寫程式,我做到了,寫出來的時候激動得說不出話 函式 當 x 3時y 3 x 5,當 x 3,y 6 data segment promrt db input x 10000 10000 buffer db 6,6 dup c10 dw 10 x dw out m...