1. 程式人生 > >【藍橋杯省賽真題】日誌統計

【藍橋杯省賽真題】日誌統計

標題:日誌統計


小明維護著一個程式設計師論壇。現在他收集了一份"點贊"日誌,日誌共有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 就是符合要求的答案。 請你尋找另外一個可能