Bronze
A Cow Gymnastics
题目:https://www.luogu.com.cn/problem/P5831
题解:用数组存一下出现位置,O(n^2)枚举一下就好。
代码:
#include<bits/stdc++.h>
using namespace std;
#define re register int
#define F(x,y,z) for(re x=y;x<=z;x++)
#define FOR(x,y,z) for(re x=y;x>=z;x--)
#define I inline void
#define IN inline int
typedef long long ll;
I read(int &res){
re g=1;register char ch=getchar();res=0;
while(!isdigit(ch)){
if(ch=='-')g=-1;
ch=getchar();
}
while(isdigit(ch)){
res=(res<<3)+(res<<1)+(ch^48);
ch=getchar();
}
res*=g;
}
int n,m,a[100][100],b[100][100],sn,ans;
int main(){
freopen("gymnastics.in","r",stdin);
freopen("gymnastics.out","w",stdout);
read(m);read(n);
F(i,1,m){
F(j,1,n){
read(a[i][j]);
b[i][a[i][j]]=j;
}
}
F(i,1,n-1){
F(j,i+1,n){
sn=1;
if(b[1][i]>b[1][j]){
F(k,2,m)
if(b[k][i]<b[k][j]){
sn=0;
break;
}
}
else{
F(k,2,m){
if(b[k][i]>b[k][j]){
sn=0;
break;
}
}
}
ans+=sn;
}
}
cout<<ans;
return 0;
}
B Where Am I?
题目:https://www.luogu.com.cn/problem/P5832
题解:枚举一下K,哈希一下用map一存就行。复杂度:O(n^2)
代码:
#include<bits/stdc++.h>
using namespace std;
#define re register int
#define F(x,y,z) for(re x=y;x<=z;x++)
#define FOR(x,y,z) for(re x=y;x>=z;x--)
#define I inline void
#define IN inline int
typedef long long ll;
I read(int &res){
re g=1;register char ch=getchar();res=0;
while(!isdigit(ch)){
if(ch=='-')g=-1;
ch=getchar();
}
while(isdigit(ch)){
res=(res<<3)+(res<<1)+(ch^48);
ch=getchar();
}
res*=g;
}
const int Mod=1e9+7,bas=131;
set<int>mp;
char c[110];
int n,m,a[110],j,s;
int main(){
freopen("whereami.in","r",stdin);
freopen("whereami.out","w",stdout);
read(n);
scanf("%s",c+1);
F(i,1,n){
a[i]=c[i]-'A'+1;
}
F(len,1,n){
mp.clear();m=1;
F(i,1,n-len+1){
j=i+len-1;s=0;
F(k,i,j){
s=(ll)s*bas%Mod;
s+=a[k];
}
if(mp.count(s)){
m=0;
break;
}
mp.insert(s);
}
if(m){
cout<<len;
return 0;
}
}
return 0;
}
C Livestock Lineup
题目:https://www.luogu.com.cn/problem/P5833
题解:按字典序爆搜即可。当然,我写的比较麻烦,
建了图,还要用每个点的度数分类讨论,其实复杂度
还是一样,O(8!*8)
代码:
#include<bits/stdc++.h>
using namespace std;
#define re register int
#define F(x,y,z) for(re x=y;x<=z;x++)
#define FOR(x,y,z) for(re x=y;x>=z;x--)
#define I inline void
#define IN inline int
typedef long long ll;
I read(int &res){
re g=1;register char ch=getchar();res=0;
while(!isdigit(ch)){
if(ch=='-')g=-1;
ch=getchar();
}
while(isdigit(ch)){
res=(res<<3)+(res<<1)+(ch^48);
ch=getchar();
}
res*=g;
}
string s[9]={"0","Beatrice","Belinda","Bella","Bessie","Betsy","Blue","Buttercup","Sue"};
char c[100];
int n,m,a[10][10],x,y,du[10],ans[10],v[10];
I D_1(int x){
/* cout<<x<<" ";
F(i,1,x){
cout<<ans[i]<<" ";
}
cout<<endl;*/
if(x==9){
if(du[ans[x-1]]==2)return;
F(i,1,8){
cout<<s[ans[i]]<<endl;
}
exit(0);
}
re sn=0;
if(du[ans[x-1]]>=1){
F(i,1,8){
if(a[ans[x-1]][i]&&!v[i]){
sn++;
}
}
if(sn==2)return;
sn=1;
F(i,1,8){
if(a[ans[x-1]][i]&&!v[i]){
ans[x]=i,v[i]=1,D_1(x+1),v[i]=0;sn=0;
break;
}
}
if(!sn)return;
}
F(i,1,8){
if(v[i])continue;
ans[x]=i,v[i]=1,D_1(x+1);
ans[x]=0;v[i]=0;
}
}
int main(){
freopen("lineup.in","r",stdin);
freopen("lineup.out","w",stdout);
read(n);
memset(a,0,sizeof(a));
memset(du,0,sizeof(du));
F(i,1,n){
cin>>c+1;
m=strlen(c+1);
if(m==3)x=8;
if(m==4)x=6;
if(m==6)x=4;
if(m==7)x=2;
if(m==8)x=1;
if(m==9)x=7;
if(m==5){
if(c[3]=='l')x=3;
else x=5;
}
cin>>c+1>>c+1>>c+1>>c+1>>c+1;
m=strlen(c+1);
if(m==3)y=8;
if(m==4)y=6;
if(m==6)y=4;
if(m==7)y=2;
if(m==8)y=1;
if(m==9)y=7;
if(m==5){
if(c[3]=='l')y=3;
else y=5;
}
du[x]++;du[y]++;
a[x][y]=1;a[y][x]=1;
//cout<<x<<" "<<y<<endl;
}
F(i,1,n){
if(du[i]<2){
ans[1]=i;v[i]=1;
D_1(2);v[i]=0;
}
}
//cout<<"!";
return 0;
}
Silver
A MooBuzz
题目:https://www.luogu.com.cn/problem/P5834
题解:可以明显看出,每15次,有8个数被报出来。
随便写写就过了
代码:
B Meetings
题目:https://www.luogu.com.cn/problem/P5835
题解:相信这道题的两个套路大家应该都见过:
1.不管这些牛怎么走,他们的相对位置都是不变的(没见过的一定要细细斟酌)
2.两头牛相遇后,可以看做是“擦肩而过”,也就是并没有改变方向。所以,
我们可以直接算出每头牛走到终点的时间。
知道了这两个性质,做法就顺水推舟了:
1.用类似归并排序的方法算出时刻T,由性质1,我们对时间和重量做出贡献的并不是一头牛(一定要小心);