题目链接
Sample 1
Input
10
Bin Guigo
Grevthar Bin
GALA Grevthar
GALA TitaN
GALA Guigo
GALA Aegis
GALA Jojo
GALA Grevthar
Xiaohu Grevthar
GALA Aegis
Output
PENTA KILL!
Sample 3
Input
7
GALA Jojo
Aegis Ming
GALA Grevthar
GALA Grevthar
GALA Aegis
GALA Guigo
GALA TitaN
Output
SAD:(
题目大意:
给定一个击杀序列,判断是否有一个人连续击杀五个不同的
人
死亡不影响连续
解题思路:
因为死亡不影响五杀,那么就检查是否有其中一个人”连续“杀了五个不同的人即可。
如果测试点8错误,是没有考虑全情况:
如果一个人杀了 A B C A D E 其实也算杀了五个人(已标出)。
测试样例三表示了 A B B C D E,只能算AB或者BCDE。
C++:
#include <bits/stdc++.h>
using namespace std;
//map<string,vector<string> >ma;
map<string,int>ji;int ji_i=0;//名字转换序号
map<string,bool>yes;//记录有没有分配序号
vector<vector<int>>v(10);
int main(void){
int flag=0;
int n;cin>>n;
while(n--){
string s,ss;
cin>>s>>ss;
if(!yes[s]){//没有分配序号
yes[s]^=1;//记录已分配
ji[s]=ji_i++;//分配序号
}
if(!yes[ss]){
yes[ss]^=1;
ji[ss]=ji_i++;
}
v[ji[s]].push_back(ji[ss]);
}
for(int i=0;i<10;i++){
if(v[i].size()>=5)//没杀够五个直接跳过
for(int j=0;j<v[i].size()-4;j++){
set<int>se;
for(int k=0;k<5&&j+k<v[i].size();k++){
se.insert(v[i][j+k]);
}
//cout<<se.size()<<'*';
if(se.size()==5) { flag = 1;break; }
}
if(flag)break;
}
if(flag)cout<<"PENTA KILL!";
else cout<<"SAD:(";
return 0;
}
C语言AC代码:
#include <stdio.h>
#include <string.h>
char a[1000][300];
char b[1000][300];
int main(void){
int n;scanf("%d",&n);
if(n<5){printf("SAD:(");return 0;}//不足5个直接不用判
for(int i=0;i<n;i++){
//读入所有记录
getchar();
scanf("%s %s",a[i],b[i]);
}
for(int i=0;i<n;i++){
char bb[6][300];int bb_i=0,all=1;
strcpy(bb[bb_i++],b[i]);//记录杀过的人名
int p=0;
for(int j=i+1;j<n&&p<4;j++){//保证条件
if(!strcmp(a[j],a[i])){
p++;//保证不会超出5个
int flag=1;
for(int k=0;k<bb_i;k++){
if(strcmp(b[j],bb[k])==0) {//判断有没有重复
flag = 0;
break;
}
}
if(flag){
strcpy(bb[bb_i++],b[j]);
all++;
if(all==5){printf("PENTA KILL!");return 0;}//如果接下来连续都没有重复,即不同的五个人,可判为连续击杀5人
}
}
}
}
printf("SAD:(");
return 0;
}