iwtgm-4
Codeforces Beta Round 73 (Div. 2 Only)
B.
数据小,暴力一点的方式更好写,
自己写的优化一点的出现跑不出来的情况
优化是把所有当前字母的位置和S的位置算一个距离,取最小
确实预处理出最短距离进行映射会更好
int n,m,len,vis[27],ans;
double dis[27],x;
char mp[35][35];
double diss(int x,int y,int xx,int yy){
return sqrt((x-xx)*(x-xx)+(y-yy)*(y-yy));
}
string a;
void solve()
{
cin>>n>>m>>x;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
if(mp[i][j]>='a')vis[mp[i][j]-'a'+1]=1;
}
}
for(char g='a';g<='z';g++){
dis[g-'a'+1]=55;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(mp[i][j]==g){
for(int k=1;k<=n;k++){
for(int h=1;h<=m;h++){
if(mp[k][h]=='S')dis[g-'a'+1]=min(dis[g-'a'+1],diss(i,j,k,h));
}
}
}
}
}
}
cin>>len>>a;
for(int i=0;i<len;i++){
if((a[i]<='Z')&&dis[a[i]-'A'+1]==55||a[i]>='a'&&!vis[a[i]-'a'+1]){
cout<<-1;return ;
}
if(a[i]<='Z'&&dis[a[i]-'A'+1]>x)ans++;
}
cout<<ans;
}
全排列函数
next_permutation(start,end),求下一个排列
和prev_permutation(start,end),求上一个排列
举例:
int num[3]={1,2,3};
do
{
cout<<num[0]<<" "<<num[1]<<" "<<num[2]<<endl;
}while(next_permutation(num,num+3));
A.
环形数据,(头尾相连的循环)求距离,
从1开始映射,距离为:(下标的差+总数)%总数,
如1,2,3,4,5的循环,2-5的距离和5-2的距离是不一样的,均可由上述式子得到(后一个数-前一个数)
自己做的时候忽略循环情况,后来想到了全排列,有点懵,自己不敢写,看了题解确实是这样
map<string,int>m;
int judge(int a,int b,int c){
int x=(b-a+12)%12;
int y=(c-b+12)%12;
int z=(c-a+12)%12;
if(x==4&&y==3&&z==7)return 1;
if(x==3&&y==4)return 0;
return -1;
}
void solve()
{
m["C"]=1;m["C#"]=2;m["D"]=3;m["D#"]=4;m["E"]=5;m["F"]=6;m["F#"]=7;m["G"]=8;m["G#"]=9;m["A"]=10;m["B"]=11;m["H"]=12;
string a,b,c;
cin>>a>>b>>c;
vector<int>v;
v.push_back(m[a]);v.push_back(m[b]);v.push_back(m[c]);
sort(v.begin(),v.end());
bool f=false;
do{
int p= judge(v[0],v[1],v[2]);
if(p==1){
cout<<"major";return ;
}else if(p==0){
cout<<"minor";return ;
}
} while (next_permutation(v.begin(),v.end()));
cout<<"strange";
}