【藍橋杯省賽真題】日誌統計
標題:日誌統計
小明維護著一個程式設計師論壇。現在他收集了一份"點贊"日誌,日誌共有N行。其中每一行的格式是:
ts id
表示在ts時刻編號id的帖子收到一個"贊"。
現在小明想統計有哪些帖子曾經是"熱帖"。如果一個帖子曾在任意一個長度為D的時間段內收到不少於K個贊,小明就認為這個帖子曾是"熱帖"。
具體來說,如果存在某個時刻T滿足該帖在[T, T+D)這段時間內(注意是左閉右開區間)收到不少於K個贊,該帖就曾是"熱帖"。
給定日誌,請你幫助小明統計出所有曾是"熱帖"的帖子編號。
【輸入格式】第一行包含三個整數N、D和K。
以下N行每行一條日誌,包含兩個整數ts和id。
對於50%的資料,1 <= K <= N <= 1000
對於100%的資料,1 <= K <= N <= 100000 0 <= ts <= 100000 0 <= id <= 100000
【輸出格式】
按從小到大的順序輸出熱帖id。每個id一行。
【輸入樣例】
7 10 2
0 1
0 10
10 10
10 1
9 1
100 3
100 3
【輸出樣例】
1
3
資源約定:
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗 < 1000ms
--------------------------------------------------------
這道題比賽的時候我是沒有做出來的,我想到用vector排序瞭然後又想到優先佇列什麼的,然後發現因為它是要看“任一個區間”,而且資料量還挺大的,我覺得暴力也煩(當然,如果暴力了能騙到分則是好的!!!),就沒寫。
看了個解析,原來方法是“尺取法”。如果我早先了解了這個方法,這道題就迎刃而解了(所以還需要多學方法和應用練習!)
思路:因為觀察到輸入裡面一個事件id可以有多個時間,所以就用vector來存對應的多個時間——vector型陣列!(god,當時真沒想到vector型陣列。。。T T)。然後對於每一個事件,把時間排好序,去它的vector裡面根據題意用尺取法就好了。
程式碼:
#include<iostream> #include<bits/stdc++.h> using namespace std; int n,d,k; const int maxn=1e5+5; vector<int> thing[maxn]; bool judge(int id) { int len=thing[id].size(); if(len<k) return false; sort(thing[id],thing[id]+len); int start=0;int end=0; int cnt=0; while(start<=end && end<len) { cnt++; if(cnt>=k) { if(thing[id][end]-thing[id][start]<d) //注意是小於(題中說是前閉後開區間 return true; else //如果if語句不成立,那麼你再去後移end,也是不符要求的,所以該後移start了 { cnt--; start++; } } end++; } return false; } int main() { cin>>n>>d>>k; for(int i=1;i<=n;i++) { int ts,id; cin>>ts>>id; thing[id].push_back(ts); } }
關於“尺取法”,我的理解:
(1)啥情況適合用尺取法:涉及“(尋找任一個)區間”。
(2)想清楚兩個點:①針對題意,怎麼找到這個區間,即這個區間應滿足怎樣的條件。②關於start和end標識,什麼時候start++,什麼時候end++,什麼時候應該跳出迴圈。anyway,要好好分析題意,結合題意設計。
相關推薦
【藍橋杯省賽真題】日誌統計
標題:日誌統計小明維護著一個程式設計師論壇。現在他收集了一份"點贊"日誌,日誌共有N行。其中每一行的格式是:ts id 表示在ts時刻編號id的帖子收到一個"贊"。 現在小明想統計有哪些帖子曾經是"熱帖"。如果一個帖子曾在任意一個長度為D的時間段內收到不少於K個贊,小明就
2018第九屆藍橋杯省賽真題JAVA語言 C組真題題解答案(全)
第九屆藍橋杯省賽JAVA語言 C組題解(全) 題1 哪天返回 小明被不明勢力劫持。後被扔到x星站再無問津。小明得知每天都有飛船飛往地球,但需要108元的船票,而他卻身無分文。 他決定在x星戰打工。好心的老闆答應包食宿,第1天給他1元錢。 並
第八屆藍橋杯省賽真題
標題:日期問題 小明正在整理一批歷史文獻。這些歷史文獻中出現了很多日期。小明知道這些日期都在1960年1月1日至2059年12月31日。令小明頭疼的是,這些日期採用的格式非常不統一,有采
2018第九屆藍橋杯省賽真題 C語言B組 第一題
標題:第幾天 2000年的1月1日,是那一年的第1天。 那麼,2000年的5月4日,是那一年的第幾天? 注意:需要提交的是一個整數,不要填寫任何多餘內容。 答案:125 可以被四百整除,所以是
2018第九屆藍橋杯省賽真題 C語言B組 第六題 遞增三元組
標題:遞增三元組 給定三個整數陣列 A = [A1, A2, … AN], B = [B1, B2, … BN], C = [C1, C2, … CN], 請你統計有多少個三元組(i, j,
第九屆藍橋杯省賽(8) -- 日誌統計
標題:日誌統計 小明維護著一個程式設計師論壇。現在他收集了一份"點贊"日誌,日誌共有N行。其中每一行的格式是: ts id 表示在ts時刻編號id的帖子收到一個"贊"。 現在小明想統計有哪些帖子曾經是"熱帖"。如果一個帖子曾在任意一個長度為D的時間段內收到不
2018藍橋杯 省賽D題(測試次數)
list 需要 拓展 解釋 pan 大廠 測試 當前 con x星球的居民脾氣不太好,但好在他們生氣的時候唯一的異常舉動是:摔手機。各大廠商也就紛紛推出各種耐摔型手機。x星球的質監局規定了手機必須經過耐摔測試,並且評定出一個耐摔指數來,之後才允許上市流通。x星球有很多高聳入
2017藍橋杯 省賽C題(承壓計算)
clas 人員 cst bitset deque div 省賽 金屬 高精度 X星球的高科技實驗室中整齊地堆放著某批珍貴金屬原料。 每塊金屬原料的外形、尺寸完全一致,但重量不同。金屬材料被嚴格地堆放成金字塔形。
2017藍橋杯 省賽D題(方格分割)
namespace 不同的 clu col lcm 多余 lib south lis 6x6的方格,沿著格子的邊線剪開成兩部分。要求這兩部分的形狀完全相同。 如圖:p1.png, p2.png, p3.png 就是可行的分割法。 試計算:包括這3種分法在內,一共
2018年第九屆藍橋杯 第b八題:日誌統計(滿分21分)
event pen lap nbsp back 進行 幫助 輸出 約定 標題:日誌統計 小明維護著一個程序員論壇。現在他收集了一份"點贊"日誌,日誌共有N行。其中每一行的格式是: ts id 表示在ts時刻編號id的帖子收到一個"贊"。 現在小明想統計有哪些帖子
【DFS】(2018)第九屆藍橋杯省賽 C/C++ A組(第九題)
第九題 題目標題:倍數問題【題目描述】眾所周知,小蔥同學擅長計算,尤其擅長計算一個數是否是另外一個數的倍數。但小蔥只擅長兩個數的情況,當有很多個數之後就會比較苦惱。現在小蔥給了你 n 個數,希望你從這
【只含質因子的數】(2018)第九屆藍橋杯省賽 C/C++ A組(第四題)
第四題 題目標題:第幾個幸運數到x星球旅行的遊客都被髮給一個整數,作為遊客編號。x星的國王有個怪癖,他只喜歡數字3,5和7。國王規定,遊客的編號如果只含有因子:3,5,7,就可以獲得一份獎品。我們來看前
【DFS填數】(2016)第七屆藍橋杯省賽 C/C++ A組 題解(第三題)
第三題 題目 如圖,如下的10個格子,填入0~9的數字。要求:連續的兩個數字不能相鄰。 (左右、上下、對角都算相鄰)一共有多少種可能的填數方案? 請填寫表示方案數目的整數。思路分析
第九屆藍橋杯【C/C++省賽B組】【第八題:日誌統計】
#include <iostream> using namespace std; /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int ma
【拓展Euclid】(2017)第八屆藍橋杯省賽) C/C++ A組 題解(第八題)
標題:包子湊數小明幾乎每天早晨都會在一家包子鋪吃早餐。他發現這家包子鋪有N種蒸籠,其中第i種蒸籠恰好能放Ai個包子。每種蒸籠都有非常多籠,可以認為是無限籠。每當有顧客想買X個包子,賣包子的大叔就會迅速選出若干籠包子來,使得這若干籠中恰好一共有X個包子。比如一共有3種蒸籠,分別能放3、4和5個包子。當顧客想買1
【暴力自動生成排列】(2015)第六屆藍橋杯省賽 C/C++ B組 題解(第三題)
第三題題目三羊獻瑞觀察下面的加法算式: 祥 瑞 生 輝 + 三 羊 獻 瑞------------------- 三 羊 生 瑞 氣(如果有對齊問題,可以參看【圖1.jpg】)其中
第五屆藍橋杯大賽個人賽(軟件類)省賽真題
turn 滿足 方法 省賽 left n-1 遊戲 藍橋杯 0ms 第一題 輸入一個字符串,求它包含多少個單詞。單詞間以一個或者多個空格分開。第一個單詞前,最後一個單詞後也可能有0到多個空格。比如:" abc xyz" 包含兩個單詞,"ab c xyz
【藍橋杯練習-第五屆】2014-省賽-C語言大學A組
1.猜年齡 小明帶兩個妹妹參加元宵燈會。別人問她們多大了,她們調皮地說:“我們倆的年齡之積是年齡之和的6倍”。小明又補充說:“她們可不是雙胞胎,年齡差肯定也不超過8歲啊。” 請你寫出:小明的較小的妹妹的年齡。 (10) #include <
第五屆藍橋杯軟體類省賽真題-C-A-1_猜年齡
/*【題目】 標題:猜年齡 小明帶兩個妹妹參加元宵燈會。別人問她們多大了,她們調皮地說:“我們倆的年齡之積是年齡之和的6倍”。 小明又補充說:“她們可不是雙胞胎,年齡差肯定也不超過8歲啊。
第六屆藍橋杯 軟體類省賽真題 第七題:加法變乘法
加法變乘法 我們都知道:1+2+3+ ... + 49 = 1225 現在要求你把其中兩個不相鄰的加號變成乘號,使得結果為2015 比如: 1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015 就是符合要求的答案。 請你尋找另外一個可能