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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

CCSP2016-1 选座(ticket_chooser)

發(fā)布時間:2024/1/1 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CCSP2016-1 选座(ticket_chooser) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

CCSP2016-1 選座(ticket_chooser)

【題目描述】
小 B 是一個電影迷,只要有時間,她就要去觀摩最新的大片。但她不喜歡自己在 電腦或其他電子設備上觀看,而是喜歡去電影院,因為她覺得那里更有氣氛。 由于工作關系,小 B 這次被派到 A 地一段時間,她發(fā)現(xiàn)這里的電影院和她熟悉的 模式完全不同。 電影院內(nèi)部都是正方形的,一共有 k 排,從前到后按照 1 到 k 編號,每排內(nèi)有 k 個座位,從左到右按照 1 到 k 編號,其中 k 為奇數(shù)。 考慮到安全因素,座位不允許購票者自行挑選,而是由售票人員通過電腦程序確定。 由于大家都希望有更好的觀影效果,因此一般都傾向于選擇更靠近影院中心的座位。 電腦程序選擇座位的過程為: 如果有人需要購買 m 張電影票,程序首先會確定一個排號 x,并從中選擇一段連 續(xù)且尚未售出的座位號 [l,r] ,其中 r?l + 1 = m 。 如果沒有任何一排中有 m 個連續(xù)的空座位,則電腦程序會報錯,在這個購票請求 中將不會賣出任何票。 在保證選出的座位在同一排且座位號連續(xù)的前提下,程序會選擇最 ‘‘接近中心’’ 的 座位。 具體來說,令 xcx_{c}xc? = ycy_{c}yc? = (k+1)/2 ,表示影院中最中心的座位。定義選出的這些座位到 影院中心的距離函數(shù)為:
∑i=lr∣x?xc∣+∣i?yc∣\sum_{i=l}^{r}|x?x_{c}|+|i?y_{c}| i=lr?x?xc?+i?yc?

最 ‘‘接近中心’’ 的座位為能最小化上述函數(shù)的座位。若有多個可選座位均滿足離影 院中心距離最小的條件,則選座程序優(yōu)先選擇靠前的座位(即排號 x 最小的座位)。若 仍有多個座位符合要求,則選座程序優(yōu)先選擇靠左的座位(即座位號 l 值最小的座位)。 假設電影院最開始沒有售出任何座位,小 B 希望知道對于給出的 n 個購票請求, 每次售出的票都能買到哪些座位?
【輸入描述】
輸入包含多組數(shù)據(jù),你需要用判斷是否讀到文件末尾的形式判斷輸入是否結(jié)束。 每組數(shù)據(jù)的第一行包含兩個正整數(shù) n 和 k,表示購票請求的數(shù)量和影院大小。保證 1≤n≤300,000,1≤k≤300,001,且 k 為奇數(shù)。 第二行為空格分隔的 n 個正整數(shù),其中第 i(1 ≤i≤n)個數(shù)為 mi,表示每次要求 購買的票數(shù),保證 1≤mi ≤k。
【輸出描述】
每組數(shù)據(jù)輸出包含 n 行,每個購買請求的結(jié)果為一行。0 如果無法在一排中買到 mi 個連續(xù)的座位,則在對應的行中輸出 ?1。否則輸出三個 空格分隔的整數(shù) x,l,r,為所買電影票的排號和起止座位號。
【樣例 1 輸入】
2 1
1 1
4 3
1 2 3 1
【樣例 1 輸出】
1 1 1
-1
2 2 2
1 1 2
3 1 3
2 1 1
【子任務】
對于 20% 的測試數(shù)據(jù),n≤50,k≤25;
對于 40% 的測試數(shù)據(jù),n≤100,k≤101;
對于 50% 的測試數(shù)據(jù),n≤1000,k≤501;
對于 60% 的測試數(shù)據(jù),n≤1000,k≤1001;
對于 70% 的測試數(shù)據(jù),n≤50000,k≤50001;
對于 80% 的測試數(shù)據(jù),n≤100000,k≤100001;
對于 90% 的測試數(shù)據(jù),n≤200000,k≤200001;
對于 100% 的測試數(shù)據(jù),n ≤ 300000,k ≤ 300001 ,保證每個測試點的數(shù)據(jù)組數(shù)不 超過 5 組。

#include<iostream> #include<stdio.h> #include<string.h> #include<fstream> #include<math.h> using namespace std; const int K=300002; const int N=300001; //因為要盡量往中間坐,所以每排只要有人必定連座 //L[i]:從中間往兩邊指向左邊第一個空位置,R[i]同理。 int L[K],R[K],n,k,s,x,start,end,l,r,temp; int dis(int x,int l,int r){ int sum=0,f=(k+1)/2; for(int i=l;i<=r;i++) sum+=(abs(f-x)+abs(f-i)); return sum; } void getseat(int &temp,int &i,int &s,int &x,int &l,int &r,int &start,int &end){ temp=dis(i,start,end);if (temp<s) s=temp,x=i,l=start,r=end; else if (temp==s&&i<x) x=i,l=start,r=end; else if (temp==s&&i==x&&start<l) l=start,r=end; } int main(){ ifstream ifile("1in.txt"); while(1){ ifile>>n>>k; if(ifile.eof()) break; for(int i=1;i<=k;i++){ L[i]=(k+1)/2; R[i]=(k+1)/2; } while(n--){ int m; s=0x7fffffff; ifile>>m; for(int i=1;i<=k;i++){ if(L[i]==R[i]&&(m&1)){ start=(k+1)/2-(m+1)/2+1; end=(k+1)/2-(m+1)/2+m; getseat(temp,i,s,x,l,r,start,end); }else if(L[i]==R[i]){ start=(k+1)/2-m/2; end=(k+1)/2+m/2-1; getseat(temp,i,s,x,l,r,start,end); } if(L[i]>=m){ start=L[i]-m+1; end=L[i]; getseat(temp,i,s,x,l,r,start,end); } if(R[i]+m-1<=k){ start=R[i]; end=R[i]+m-1; getseat(temp,i,s,x,l,r,start,end); } } if(s==0x7fffffff){ printf("-1\n"); continue; } L[x]=min(L[x],l-1);//可能落座在右半邊,所以要與原值比較 R[x]=max(R[x],r+1); printf("%d %d %d\n",x,l,r); } } return 0; }

總結(jié)

以上是生活随笔為你收集整理的CCSP2016-1 选座(ticket_chooser)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。