zoukankan      html  css  js  c++  java
  • 2020 11 1 天梯赛

    7-6 连续因子:

    思路:先判断输入的n是不是素数,如果是那么连续因子便只有n本身,此时只需输出1和n即可;如果n不是素数,那么通过递归来判断最大的连续因子数,并将此时的连续因子存在set里,最后输出mmax和set即可。

    WA了一次是因为没有考虑n是素数的情况,另外有的题解说必须要开long long,也没必要。

    代码如下:

    #include<iostream>
    #include<string>
    #include<algorithm>
    #include<set>
    #include<cmath>
    using namespace std;
    #define ll long long
    ll  mmax=-1;
    set<int>s;
    int dfs(int n,int h)
    {
        if(n%h!=0)
        {
            return s.size();
        }
        else
        {
            s.insert(h);
            dfs(n/h,h+1);
        }
    }
    int f(int n)
    {
        if(n==1)
        {
            return 0;
        }
        for(int i=2;i<=sqrt(n)+1;i++)
        {
            if(n%i==0)
            {
                return 0;
            }
        }
        return 1;
    }
    int main()
    {
       int n,i,j,k;
       cin>>n;
       int tem1=f(n);
       if(tem1==1)
       {
           cout<<1<<endl;
           cout<<n<<endl;
           return 0;
       }
       set<int>mm;
       for(i=2;i<=sqrt(n)+1;i++)
       {
           s.clear();
           int tem=dfs(n,i);
           if(mmax<tem)
           {
               mmax=tem;
               mm=s;
           }
       }
       cout<<mmax<<endl;
       set<int>::iterator p;
       for(p=mm.begin();p!=mm.end();p++)
       {
           if(p!=mm.begin())
           {
               cout<<"*"<<*p;
           }
           else
           {
               cout<<*p;
           }
       }
        return 0;
    }


    7-9 特立独行的幸福

    思路:从a到b遍历每一个数,用一个happiness函数判断这个数是否为独立的幸福数,如果是,就记录下来,最后输出所有独立的幸福数即可。

    代码如下:

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long//1 te pan
    map<int,int>m;
    int a,b;
    bool f(int n)
    {
    int i;
    if(n==1)
    {
    return 0;
    }
    for(i=2; i<=sqrt(n)+1; i++)
    {
    if(n%i==0)
    {
    return 0;
    }
    }
    return 1;
    }
    int happiness(int n)
    {
    int i,j,k;
    k=n;
    int sum=n;
    int p=1;
    int num=0;
    set<int>s;
    s.insert(n);
    while(sum!=1)
    {
    k=sum;
    sum=0;
    while(k>0)
    {
    p=(k%10);
    p*=p;
    sum+=p;
    k/=10;
    }
    if(s.find(sum)!=s.end())
    {
    return 0;
    }
    else
    {
    s.insert(sum);
    }
    num++;
    m[sum]=0;
    }
    return num;
    }
    int main()
    {
    int n,i,j,k;
    cin>>a>>b;
    for(i=a;i<=b;i++)
    {
    if(m.find(i)!=m.end()&&m[i]==0)
    {
    ;
    }
    else
    {
    int tem=happiness(i);
    if(tem==0)
    {
    ;
    }
    else
    {
    if(f(i)==1)
    {
    m[i]=2*tem;
    }
    else
    {
    m[i]=tem;
    }
    }
    }
    }
    int u=0;

    map<int,int>::iterator p;
    for(p=m.begin();p!=m.end();p++)
    {
    if(p->second!=0)
    {
    cout<<p->first<<" "<<p->second<<endl;
    u++;
    }
    }
    if(u==0)
    {
    cout<<"SAD"<<endl;
    }

    return 0;
    }

    7-11秀恩爱,分得快:

    一直WA一个点,最后也没改出来。

    思路:用一个sex数组记录输入的性别,然后用字符串存储输入的每一个人(不能用整型,-0和0的区别),然后将输入的字符串转换为整型的绝对值,存入vector中,最后在vector中寻找要查找的数,计算每一个人的亲密度,遍历亲密度数组,求出最大亲密度的人,按要求输出即可。

    代码如下:

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define maxn 1008
    int sex[maxn];
    double aa[maxn]={0},bb[maxn]={0};
    vector<vector<int>>v;
    void print(int a, int b){
    if(sex[a]) cout << "-";
    cout << a << " ";
    if(sex[b]) cout << "-";
    cout << b << endl;
    }

    int main()
    {
    int n,i,j,k,m;
    cin>>n>>m;
    v.resize(m+1);
    string s;
    for(i=0;i<m;i++)
    {
    cin>>k;
    for(j=0;j<k;j++)
    {
    cin>>s;
    if(s[0]=='-')
    {
    sex[abs(atoi(s.c_str()))]=1;
    }
    else
    {
    sex[abs(atoi(s.c_str()))]=0;
    }
    v[i].push_back(abs(atoi(s.c_str())));
    }

    }
    string a,b;
    int ia,ib;
    cin>>a>>b;
    ia=abs(atoi(a.c_str()));
    ib=abs(atoi(b.c_str()));
    if(a[0]=='-')
    {
    sex[ia]=1;
    }
    else
    {
    sex[ia]=0;
    }
    if(b[0]=='-')
    {
    sex[ib]=1;
    }
    else
    {
    sex[ib]=0;
    }
    double maxa=-1,maxb=-1;
    for(i=0;i<m;i++)
    {
    bool finda=find(v[i].begin(),v[i].end(),ia)!=v[i].end();
    bool findb=find(v[i].begin(),v[i].end(),ib)!=v[i].end();
    if(finda||findb)
    {
    for(j=0;j<v[i].size();j++)
    {
    int c=v[i][j];
    if(finda&&sex[ia]!=sex[c])
    {
    aa[c]+=1.0/v[i].size();
    maxa=max(maxa,aa[c]);
    }
    if(findb&&sex[ib]!=sex[c])
    {
    bb[c]+=1.0/v[i].size();
    maxb=max(maxb,bb[c]);
    }
    }
    }
    }
    if(maxb==bb[ia]&&maxa==aa[ib])
    {
    //cout<<"ceshi"<<endl;
    print(ia,ib);
    }
    else
    {
    for(i=0;i<n;i++)
    {
    if(maxa==aa[i])
    {
    print(ia,i);
    }
    }
    for(i=0;i<n;i++)
    {
    if(maxb==bb[i])
    {
    print(ib,i);
    }
    }
    }
    return 0;
    }

  • 相关阅读:
    常见网络设备工作原理
    Linux逻辑卷的创建
    关于华为模拟器eNSP-防火墙USG6000V怎么重装镜像
    一人之下(名言吧)
    Struts2学习笔记——Struts2搭建和第一个小程序
    eclipse部署Tomcat9
    通过反射访问类的私有方法(无参)
    Java学习笔记之——IO
    Java学习笔记之——线程的生命周期、线程同步
    Java学习笔记之——多线程
  • 原文地址:https://www.cnblogs.com/chengxvzhishen/p/13924663.html
Copyright © 2011-2022 走看看