pokemon

第一题:


image.png

不怕题目难,就怕题目有歧义,一开始我将“当某一天你抓到的宝可梦数量达到 N时”理解为sn=N,但题目意思其实是an=N,死都AC不了让我很尴尬。后来才悟到他的意思。
标准代码如下:

#include<iostream>
using namespace std;
int main(void)
{
    long long N;
    long long n;
    long long pokemmo;
    while (cin >> N)
    {
        n = pokemmo = 1;
        while (n < N)
        {       
            n++;
            pokemmo = 1*n+((n*(n-1))/2)*1;
        }
        pokemmo = 2 * pokemmo - n;
        cout << pokemmo << endl;
    }
}

不难发现,这个等差数列求和公式可以化简,将1n+((n(n-1))/2)*1乘以2-n,结果为n^2
因此代码可写成:

#include<iostream>
using namespace std;
int main(void)
{
    long long N;
    while (cin >> N)
    {
        cout << N*N << endl;
    }
}

第二题(不能AC,原因未知):
思路:
1.先写一个函数用于判断两个数是否互质,
2.如果两个数不互质,则让较大的数为0,不参与之后的判断,比如12,6,4
12的因数:6,4,3,2
6的因数:3,2
4的因数:2
可知,在两个数不互质的情况下,较大的数具有更多的因数,不互质的可能性更大。为了确保结果有更多的质数,在两个数互质的情况下要去掉较大的那一个。
3.数到最后还剩几个不为0的数。
代码如下:

#include<iostream>
using namespace std;

long long gcd(long a, long b) {
    return b ? gcd(b, a % b) : a;
}

void niubi(int n, long long a[20])
{
    long long i, j;
    for (i = 0; i <n; i++)
    {
        for (j = 0; j < n; j++)
        {       
            if(a[i] != 0 && a[j] != 0&&a[j]!=a[i])
                if (gcd(a[i],a[j])!=1)//判断两个数是否互质
                {
                    if (a[i] >= a[j]) a[i] = 0;
                    else a[j] = 0;          
                }   
        }
    }
}

int main()
{
    int T;
    int n;
    int i, j;
    int sum ;
    long long a[20];
    while (cin >> T)
    {
        while(T--)
        {
            cin >> n;
            sum = 0;
            for (j = 0; j < n; j++)
                cin >> a[j];

            niubi(n, a);

            /*for (j = 0; j < n; j++)
                cout <<"a[j]="<< a[j]<<endl;*/
            for (j = 0; j < n; j++)
                if (a[j] != 0) sum++;
            cout << sum << endl;
        }
    }
    return 0;
}

第三题:
我在竞赛书曾经看过一道题,与这道题大同小异,所以非常好做。那道题是判断a是否能删除0到多个字符获得b,这个是定死在两个字符。
思路:由于b一定是a删除两个得到,则他们的长度必定相差2,如果相差2,则继续判断a能否得到b
代码如下:

#include<iostream>
#include<string.h>
using namespace std;
char a[1000005], b[1000005];
int main() {

    int T;
    while(cin >> T)
    {
        while (T--)
        {
            cin >> b >> a;
            int star = 0, lenb = strlen(b), lena = strlen(a);
            if (lenb - lena != 2)
            {
                cout << 0 << endl;
            }
            else
            {
                for (int i = 0; i < lenb; i++)
                {
                    if (a[star] == b[i])
                        star++;
                    if (star == lena) //代表可以在长字串中找到短串
                    {
                        cout << 1 << endl;
                        break;
                    }
                }
                if (star != lena)
                    cout << 0 << endl;
            }       
        }
    }
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容