2021-04-09 PAT A1105 A1017 A1014

一開始我這么做超時(shí)了戴已,但是今天早上看了一下標(biāo)準(zhǔn)答案罗侯,感覺跟我的做法時(shí)間差不了多少啊,而且規(guī)定的時(shí)間是200ms音比,不可能超時(shí)啊妖滔,然后就檢查了一下隧哮,很驚喜的發(fā)現(xiàn),我的方法居然過了座舍。
好開心啊
這個(gè)方法就是用X和Y換向來填充沮翔,但是速度肯定是比不上標(biāo)準(zhǔn)答案的那個(gè)啦,標(biāo)準(zhǔn)答案的那個(gè)簸州,一看就知道是很快的方法

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int input[100010];
bool cmp(int a, int b) { return a > b; }
int directionX[4] = { 1,0,-1,0 };
int directionY[4] = { 0,-1,0,1 };
int matrix[10000][10000];
int main() {
    int n; scanf("%d", &n);
    int rows, cols, half = ceil(sqrt(n)) ;
    for (int i = half; i <= n; i++)
        if (n % i == 0) {
            rows = i;
            cols = n / i;
            break;
        }
    for (int i = 0; i < n; i++) scanf("%d", &input[i]);
    sort(input, input + n, cmp);
    for (int i = 1; i <= cols; i++)matrix[1][i] = input[i - 1];
    int index = 0, index_X = 1, index_Y = cols , substract = 0;//用來指示方向,code用來表示第幾輪了
    for (int i = cols ; i < n;) {
        if (index % 2 == 0)substract++;
        int end;
        if (directionX[index]) end = rows - substract;
        else end = cols - substract;
        for (int j = 0; j < end; j++) {
            index_X += directionX[index];
            index_Y += directionY[index];
            matrix[index_X][index_Y] = input[i++];
        }
        index = (index + 1) % 4;
    }
    for (int i = 1; i <= rows; i++) {
        printf("%d", matrix[i][1]);
        for (int j = 2; j <= cols; j++)
            printf(" %d", matrix[i][j]);
        printf("\n");
    }
}

A1017 優(yōu)先隊(duì)列實(shí)現(xiàn)

#include<cstdio>
#include<vector>
#include<utility>
#include<queue>
#include<algorithm>
using namespace std;
int main() {
    priority_queue<pair<float, float>, vector<pair<float, float> >, greater<pair<float, float> > > customers;
    priority_queue<float,vector<float>,greater<float> > windows;
    int customers_num, windows_num,customers_sum = 0; scanf("%d %d", &customers_num, &windows_num);
    float close_time = 17 * 60;
    for (int i = 0; i < customers_num; i++) {
        float HH, SS, MM, proccesse; scanf("%f:%f:%f %f", &HH, &MM, &SS, &proccesse);
        MM += SS / 60 + HH * 60;
        if (proccesse > 60) proccesse = 60;
        if (MM <= close_time) { customers.push(pair<float, float>(MM, proccesse)); customers_sum++; }
    }
    float waitTimeSum = 0, open_time = 8 * 60;
    for (int i = 0; i < windows_num; i++)windows.push(open_time);
    while (customers.size() && windows.size()) {
        pair<float, float> now_customer = customers.top(); customers.pop();
        if (windows.top() > now_customer.first){waitTimeSum += windows.top() - now_customer.first;windows.push(windows.top() + now_customer.second);}
        else windows.push(now_customer.first + now_customer.second);
        windows.pop();
    }
    printf("%.1f\n", waitTimeSum / (float)customers_sum);
}

用隊(duì)列實(shí)現(xiàn)鉴竭,第一次做的時(shí)候溢出了
使用const int INF = 0x3fffffff 一定要注意它會(huì)不會(huì)有好幾個(gè)數(shù)字相加

#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int INF = 0x3fffffff;
int finish_time[1010], last_one[22];//用來記錄窗口的上一個(gè)處理的對(duì)象
int main(){
    queue<int> window[22];
    int windows_num, line_capacity,customers_num,queries,close_time = 17 * 60;
    scanf("%d %d %d %d",&windows_num,&line_capacity,&customers_num,&queries);
    for(int i = 0;i < windows_num;i++) last_one[i] = 480;
    int first_deal = min(customers_num,line_capacity * windows_num), index = 0;//先處理黃線中的顧客
    for(int i = 1;i <= first_deal;i++){
        int processe;scanf("%d",&processe);
        if(last_one[index] >= close_time) {last_one[index] = INF;finish_time[i] = INF;}
        else {processe += last_one[index];last_one[index] = processe;finish_time[i] = processe;}
        window[index++].push(i);
        if(index == windows_num) index = 0;//用條件判斷來代替除法
    }
    for(int i = first_deal + 1 ;i <= customers_num;i++){
        int processe;scanf("%d",&processe);
        int minindex = 0,min_num = INF;
        for(int j = 0;j < windows_num;j++)
            if(finish_time[window[j].front()] < min_num){//隊(duì)首元素最早的結(jié)束的歧譬,那么這個(gè)就會(huì)空出來岸浑,下一個(gè)元素就能進(jìn)來
                min_num = finish_time[window[j].front()];
                minindex = j;
            }
        window[minindex].pop();
        if(last_one[minindex] >= close_time) {last_one[minindex] = INF;finish_time[i] = INF;}
        else {processe += last_one[minindex];last_one[minindex] = processe;finish_time[i] = processe;}
        window[minindex].push(i);
        
    }
    for(int i = 0;i < queries;i++){
        int q;scanf("%d",&q);
        if(finish_time[q] == INF)printf("Sorry\n");
        else printf("%02d:%02d\n",finish_time[q] / 60,finish_time[q] % 60);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末搏存,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子矢洲,更是在濱河造成了極大的恐慌璧眠,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件读虏,死亡現(xiàn)場離奇詭異责静,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)盖桥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門灾螃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人揩徊,你說我怎么就攤上這事腰鬼。” “怎么了塑荒?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵熄赡,是天一觀的道長。 經(jīng)常有香客問我齿税,道長彼硫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任凌箕,我火速辦了婚禮拧篮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘牵舱。我一直安慰自己他托,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布仆葡。 她就那樣靜靜地躺著赏参,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沿盅。 梳的紋絲不亂的頭發(fā)上把篓,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音腰涧,去河邊找鬼韧掩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛窖铡,可吹牛的內(nèi)容都是我干的疗锐。 我是一名探鬼主播坊谁,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼滑臊!你這毒婦竟也來了口芍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤雇卷,失蹤者是張志新(化名)和其女友劉穎鬓椭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體关划,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡小染,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贮折。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裤翩。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖调榄,靈堂內(nèi)的尸體忽然破棺而出踊赠,到底是詐尸還是另有隱情,我是刑警寧澤振峻,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布臼疫,位于F島的核電站,受9級(jí)特大地震影響扣孟,放射性物質(zhì)發(fā)生泄漏烫堤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一凤价、第九天 我趴在偏房一處隱蔽的房頂上張望鸽斟。 院中可真熱鬧,春花似錦利诺、人聲如沸富蓄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽立倍。三九已至,卻和暖如春侣滩,著一層夾襖步出監(jiān)牢的瞬間口注,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國打工君珠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寝志,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像材部,于是被迫代替她去往敵國和親毫缆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容