您的位置:首页 > 其它

BestCoder Round #54 (div.2) 题解

2015-09-07 22:21 453 查看
最后1002TLE了,好遗憾没有AK,若菜第一次如此接近AK,不说了,还是好好码题吧。

1001 A problem of sorting

思路:getline整行读入

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>

using namespace std;

struct point
{
int x;string s;
}p[105];

string s;

bool cmp(point a,point b)
{
return a.x>b.x;
}

int main()
{
//freopen("in.txt","r",stdin);
int n,T;scanf("%d",&T);
while(T--)
{
scanf("%d",&n);getchar();
for(int i=0;i<n;++i)
{
getline(cin,s);
int x=s.length(),o=0;
for(int j=x-4;j<=x-1;++j)
{
o=o*10+(s[j]-'0');
}
p[i].s=s.substr(0,x-5);p[i].x=o;
}
sort(p,p+n,cmp);
for(int i=0;i<n;++i)
{
cout<<p[i].s<<endl;
}
}
return 0;
}


1002 The Factor

思路:找最小的两个质因子,不足则为-1

//map实现,注意特判size为0的情况
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <map>

using namespace std;

int n,a;

map <int,int> mp;

void fac(int x)
{
int now=x;
for(int i=2;i<=x/i;++i)
if(now%i==0)
{
while(now%i==0)
{
++mp[i];now/=i;
}
}
if(now!=1)++mp[now];
}

int main()
{
//freopen("in.txt","r",stdin);
int T;scanf("%d",&T);
while(T--)
{
mp.clear();long long ans;
scanf("%d",&n);
for(int i=0;i<n;++i)
{
scanf("%d",&a);
fac(a);
}
if(mp.size()==0)
{
puts("-1");continue;
}
map <int,int> ::iterator it=mp.begin();
long long q=(long long)it->first;
if(it->second>=2)
{
ans=q*q;
printf("%I64d\n",ans);
continue;
}
++it;
if(it==mp.end())
{
puts("-1");continue;
}
else
{
long long o=(long long)it->first;
ans=q*o;
printf("%I64d\n",ans);
continue;
}
puts("-1");
}
return 0;
}

//priority_queue实现
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <map>
#include <queue>

using namespace std;

int n,a;

priority_queue <int> q;

void fac(int x)
{
int now=x;
for(int i=2;i<=x/i;++i)
if(now%i==0)
{
while(now%i==0)
{
q.push(i);
while(q.size()>2)q.pop();
now/=i;
}
}
if(now!=1)
{
q.push(now);
while(q.size()>2)q.pop();
}
}

int main()
{
//freopen("in.txt","r",stdin);
int T;scanf("%d",&T);
while(T--)
{
long long ans;
while(!q.empty())q.pop();
scanf("%d",&n);
for(int i=0;i<n;++i)
{
scanf("%d",&a);
fac(a);
}
if(q.size()<2)puts("-1");
else
{
ans=(long long)q.top();
q.pop();
ans*=(long long)q.top();
printf("%I64d\n",ans);
}
}
return 0;
}


1003 The Factor

思路:直接高精度,注意全为0的时候Yes,若存在0且其他数有不是0的那么一定是No,特判n=1

import java.util.*;
import java.math.*;
import java.io.*;

public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n,T;T=cin.nextInt();
BigInteger a[]= new BigInteger [105];
BigInteger q=BigInteger.ZERO;
while(T-->0)
{
n=cin.nextInt();
int ans=0;
boolean flag=false;
for(int i=0;i<n;i++)
{
a[i]=cin.nextBigInteger();
if(a[i].compareTo(q)==0){flag=true;ans++;}
}
if(ans==n)
{
System.out.println("Yes");
continue;
}
if(n==1)
{
System.out.println("Yes");
continue;
}
if(flag==true)
{
System.out.println("No");
continue;
}
BigInteger fac;
for(int i=1;i<=n-2;i++)
{
fac=a[i-1].multiply(a[i+1]);
if(fac.compareTo(a[i].multiply(a[i]))!=0)
{
flag=true;break;
}
}
if(flag)System.out.println("No");
else System.out.println("Yes");
}
}
}


1004 Reflect

思路:见官方题解,写了前4项后纯属YY

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <map>

using namespace std;

int calcPhi(int n)
{
int ans = n;
for (int i = 2; i * i <= n; i++) if (n % i == 0)
{
ans -= ans / i;
while (n % i == 0) n /= i;
}
if (n > 1) ans -= ans / n;
return ans;
}

int main()
{
//freopen("in.txt","r",stdin);
int n,T;
scanf("%d", &T);
while(T--)
{
scanf("%d",&n);
int ans=calcPhi(n+1);
cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: