首页 > 其他分享 >iwtgm-4

iwtgm-4

时间:2023-11-02 13:34:02浏览次数:34  
标签:12 return cout int iwtgm mp &&

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";
}

标签:12,return,cout,int,iwtgm,mp,&&
From: https://www.cnblogs.com/wwww-/p/17789149.html

相关文章

  • iwtgm-10
    题目链接A.手玩,左右循环后对应位置字符相同,可得到:如果只有两个字符一定可以如果是奇数,那么必须全部相同如果是偶数,那么奇数位置的要全部相同,偶数位置的要全部相同卡的点是相对位置不变,可以删除任意位置,如何判奇数全部相同,偶数全部相同后来看@zys111代码,因为只有两种字符(可......
  • iwtgm-9
    题目链接dp,自己写的时候没有考虑完全状态转移,其实是滑动窗口dp,需要维护一段区间的最小值1-n内的数显然能一步得到,考虑n+1到y,可由前面的状态加数得到也可以乘数得到,考虑加,其实是区间长度为n的滑动窗口的最小值+1考虑乘,若当前数i能整除mi,则dp[mi]+1inta[N],dp[N],q[N],tt=-1,......
  • iwtgm-8
    题目链接A.模拟,先遍历一遍,出现0,则i+x和i-x存在则必是0再遍历一遍,出现1,判i+x和i-x位上若已经是1或还没被赋值则满足题意,否则失败退出输出是当前位是1,则输出1,否则输出0.因为1的限制范围明确,其余都填0voidsolve(){strings;cin>>s;intx;cin>>x;charc[N];......