第九屆藍橋杯【C/C++省賽B組】【第八題:日誌統計】
阿新 • • 發佈:2019-02-06
#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char** argv) {
int n, d, k;
cin>>n>>d>>k; //輸入 N、D、K
int **p1 = new int*[n]; //建立動態的二維陣列,用於存放輸入的日誌
for(int i = 0; i < n; i++){
p1[i] = new int[2];
}
for(int j = 0; j < n; j++){ //輸入日誌
cin>>p1[j][0]>>p1[j][1];
}
int **p2 = new int*[n]; //建立動態二維陣列p2,其中第一列存放被點讚的id,第二列存放該id被點讚的次數,
for(int i = 0; i < n; i++){ // 接下來的若干列分別存放該id被點讚的時間
p2[i] = new int[n+2];
}
int num1 = 0; // num1 --- 表示p2陣列的行數,也就是被點讚的id的個數
for(int i = 0; i < n; i++){ // 將日誌中的id取出放入p2陣列的第一列
if(num1 == 0){
p2[num1++][0] = p1[i][1];
}else{ //p1陣列中的第一個id可直接存入p2陣列,從第二個開始就要先"查重",
int flag = 0; // 若p2陣列中沒有該id然後再將該id存入p2陣列的第一列
for(int j = 0; j < num1; j++){
if(p1[i][1] == p2[j][0]){
flag = 1;
break;
}
}
if(flag == 0){
p2[num1++][0] = p1[i][1];
}
}
} // 此時num1表示p2陣列的行數,也就是id的個數
for(int i = 0; i < num1; i++){ // 列舉p2陣列的第一列元素
int m = 2;
for(int j = 0; j < n; j++){ // 列舉p1陣列的第二列,找到與p2陣列id相同的,
if(p2[i][0] == p1[j][1]){ // 然後把點讚的時間從p2陣列的第二列依次向後存入p2陣列
p2[i][m++] = p1[j][0];
}
}
p2[i][1] = m - 2; //將每個id被點讚的次數存入p2[i][1];
}
//p2陣列中第一列儲存的是不同的id,第二列存放的是對應id的點贊次數,
// 從第三列往後依次是該id被點讚的時間
// p2[i][1]中存放的是點讚的次數
for(int i = 0; i < num1; i++){
for(int j = 2; j < p2[i][1]+2; j++){ //列舉每一個id的被點贊時間p2[i][j],然後判斷該id的被點贊時間在外層
int sum = 0; // p2[i][j]的時間區間[p2[i][j],p2[i][j]+d)內的個數是否大於等於k
int totol1 = p2[i][j] + d;
for(int l = 2; l < p2[i][1]+2; l++){
if(p2[i][l] >= p2[i][j] && p2[i][l] < totol1){
sum++;
}
}
if(sum >= k){
cout<<p2[i][0]<<endl;
break;
}
}
}
return 0;
}