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";
}
posted @ 2023-11-02 13:22  WW爆米花  阅读(15)  评论(0编辑  收藏  举报