题意:几个人想做好朋友,朋友之间相差位置小于等于k,且长度相同
分析;排序,将长度相同的放在一起。若长度相同,第i个人能放进去的条件是位置相差下雨等于k。
若不能放进去,将对头踢掉,踢到对头是第i个人的朋友的时候为止。若长度不相同,则将队列清空。
更新sum值,在第i个人进去的时候就加上队列的当前长度。
这个没考虑的问题是当长度相同,但是队列中的人都不符合其位置差,全部剔除的时候,第i个人却没有加进队列,导致错误
// Problem#: 8842 // Submission#: 2269282 // The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License // URI: http://creativecommons.org/licenses/by-nc-sa/3.0/ // All Copyright reserved by Informatic Lab of Sun Yat-sen University // Problem#: 8842 // Submission#: 2269196 // The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License // URI: http://creativecommons.org/licenses/by-nc-sa/3.0/ // All Copyright reserved by Informatic Lab of Sun Yat-sen University /* #include<stdio.h> #include<string.h> const int MN=110; int vis[MN][MN]; char str[MN][MN]; int n,m; int A,B,C,D,E; int row[]= {-1,1,0,0}; int col[]= {0,0,-1,1}; int num1[200]; int num2[200]; struct Node { int x,y; } s,e; void DFS(int x,int y,char flag) { for(int i=0; i<4; i++) { int xx=x+row[i]; int yy=y+col[i]; if(xx>=1 && xx<=n && yy>=1 && yy<=m && str[xx][yy]!='X' && vis[xx][yy]==0) { if(str[xx][yy]==flag) { num2[flag]++; } } } } void work(int i,int j) { if(str[i][j]=='S') { s.x=i; s.y=j; } else if(str[i][j]=='G') { e.x=i; e.y=j; } num1[str[i][j]]++; } int main() { int i,j; while(scanf("%d%d",&n,&m)) { A=B=C=D=E=0; for(i=1; i<=n; i++) { scanf("%s",str[i]+1); for(j=1; j<=m; j++) { work(i,j); } } for(char t='a'; t<='e'; t++) { DFS(s.x,s.y,t); if(num2[t]==num1[t]) { DFS2() } } } return 0; } */ #include <stdio.h> #include <algorithm> #include < string .h> #include <queue> using namespace std; #define LL long long const int MN= 300010 ; struct Node { char nam[ 30 ]; int len; int pos; } node[MN]; queue < int > Q; bool cmp(Node a,Node b) { if (a.len!=b.len) return a.len< b.len; return a.pos< b.pos; } int main() { int n,k,i,j; int ans; while (scanf( " %d%d " ,&n,&k)!= EOF) { getchar(); while (! Q.empty()) Q.pop(); for (i= 1 ; i<=n; i++ ) { gets(node[i].nam); node[i].len = strlen(node[i].nam); node[i].pos = i; } sort(node + 1 ,node+n+ 1 ,cmp); long long sum= 0 ; int length= 1 ; Q.push( 1 ); int t; for (i= 2 ; i<=n; i++ ) { t = Q.front(); if (node[t].len!= node[i].len) { while (! Q.empty()) Q.pop(); length = 1 ; Q.push(i); } else { if (node[i].pos-node[t].pos<= k) { Q.push(i); sum += length; length ++ ; } else { while (! Q.empty()) { t = Q.front(); if (node[i].pos-node[t].pos<= k) { Q.push(i); sum += length; length ++ ; break ; } else { Q.pop(); length -- ; if (Q.empty()) { Q.push(i); length = 1 ; break ; } } } } } } printf( " %lld\n " ,sum); } return 0 ; }