第一题:
不怕题目难,就怕题目有歧义,一开始我将“当某一天你抓到的宝可梦数量达到 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;
}