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

原文地址:https://www.cnblogs.com/chengxvzhishen/p/13924663.html