scau2016年初出茅庐题解

18203 神奇的勾股数

题意:给你一个正整数n,问有没有一个直角三角形,它所有的边长都是正整数,而且n是它的最小边长。

水题,直角三角形(三边a,b,c),显然 a² = c² - b² = (c+b)*(c-b)

因此,对n² 求一下因子,判断是否是整数解即可,时间复杂度O(n)

#include <iostream>
using namespace std;
int main()
{
    int a,n; cin >> a;
    n = a * a;
    for(int i=1; i*i<=n; i++)
    {
        if(n % i == 0 && !((n/i-i) & 1) && (n/i-i)/2 > a)
        {
            cout << (n/i-i)/2 << " " << (n/i+i)/2 << endl;
            return 0;
        }
    }
    cout << "NO" << endl;
}

18194 缩小三角形

题意:让你把边长为n的等边三角形缩小成边长为m的等边三角形。

如果一直想着如何从大的三角形去缩小是很难确定一个最优解的,正向不行就逆向咯,考虑一下如何从m->n,就很容易了,每次将最小边a 增大为 b + c - 1 (保证仍能组成三角形),这样类似一个斐波那契递增,显然得到的是最优解。

#include <iostream>
#include <algorithm>
using namespace std;
int nums[3];
int main()
{
    int n,m;
    while(cin >> n >> m)
    {
        for(int i=0; i<3; i++) nums[i] = m;
        int res = 0;
        while(true)
        {
            sort(nums,nums+3);
            if(nums[0] == n)
                break;
            nums[0] = min(n,nums[1]+nums[2]-1);
            res++;
        }
        cout << res << endl;
    }
}

18206 敲代码还是看球赛?

题意:把一个形如A.BeD的科学计数法装换为普通的十进制形式,而且已经简化了很多,题目有说明,A和D没有前导0(但可以为0),B没有尾随0(但可以为0),还规定了一个A为0时,D也必须为0(这个就是跟你说不用去处理那种类似0.0001e2的时候多出来的前导0跟小数点的处理)反正题目已经利用一些规定简化了一堆东西不用处理。。。。。。

很明显,就字符串处理一下。。。模拟题,没什么好说的,除了一点比较坑,题目没有说明,输出的时候最后一行不要输出换行,不然会错

#include <iostream>
#include <cstring>
#define ll long long
using namespace std;
int main()
{
#ifdef local
    freopen("in.txt","r",stdin);
#endif // local
    int T ; cin >> T;
    while(T--)
    {
        string s,A,B; cin >> s;
        int epos = s.find('e');
        A = s.substr(0,1);
        B = s.substr(2,epos-2);
        int D = 0;
        for(int i=epos+1;i < s.length();i++)
            D = D * 10 + s[i] - '0';

        if(A == "0" && B == "0")
            cout << 0;
        else if(D == 0)
        {
            cout << A;
            if(B != "0")
                cout << "." << B;
        }
        else
        {
            if(A != "0")
                cout << A;
            for(int i=0;i<max(D,(int)B.length());i++)
            {
                if(i < B.length()) cout << B[i];
                else cout << "0";
                if(i == D - 1 && B.length() > D)
                    cout << ".";
            }
        }
        if(T)
            cout << endl;
    }
    return 0;
}

18212 按要求输出如下2*N+1行图形

题意:没什么好说的,就输出就是了

#include <iostream>
#include <cstring>
#define ll long long
using namespace std;
int main()
{
#ifdef local
    freopen("in.txt","r",stdin);
#endif // local
    int n; cin >>n;
    for(int i=0;i<2*n+1;i++)
    {
        int x = n - abs(n - i);
        for(int j=0;j<3*n+x+1;j++)
        {
            if(j == n - x || j == 3 * n - x || j == n + x || j == 3 * n + x)
                cout << "*";
            else
                cout << " ";
        }
        cout << endl;
    }
    return 0;
}

18215 素数划分

题意:把一个数字字符串划分成每一段都不超过6个字符的,判断是否能实现每一段都是质数

直接暴搜dfs,但是感觉数据不是特别完善,而且题目没有说明每一段的数字是否可以包含前导0,但是数据水啊。。。随便搞搞就可以了

#include <iostream>
#include <cstring>
#define ll long long
using namespace std;
bool isPrime(int x)
{
    if(x < 2)
        return false;
    for(int i=2;i*i<=x;i++)
        if(x % i == 0)
        return false;
    return true;
}
char s[30+5];
int len;
bool flag = false;
void dfs(int pos)
{
    if(pos == len)
        flag = true;
    if(flag)
        return;
    int sum = 0;
    for(int i=pos;i<min(pos+6,len);i++)
    {
        sum = sum * 10 + s[i] - '0';
        if(isPrime(sum))
            dfs(i+1);
    }
}
int main()
{
#ifdef local
    freopen("in.txt","r",stdin);
#endif // local
    cin >>s; len = strlen(s);
    dfs(0);
    if(flag)
        cout << "YES\n";
    else
        cout << "NO\n";
    return 0;
}

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值