1. 程式人生 > >第九屆藍橋杯【C/C++省賽B組】【第八題:日誌統計】

第九屆藍橋杯【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 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; }