第一題:

image.png
不怕題目難,就怕題目有歧義,一開始我將“當(dāng)某一天你抓到的寶可夢數(shù)量達(dá)到 N時(shí)”理解為sn=N,但題目意思其實(shí)是an=N,死都AC不了讓我很尷尬。后來才悟到他的意思。
標(biāo)準(zhǔn)代碼如下:
#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;
}
}
不難發(fā)現(xiàn),這個(gè)等差數(shù)列求和公式可以化簡,將1n+((n(n-1))/2)*1乘以2-n,結(jié)果為n^2
因此代碼可寫成:
#include<iostream>
using namespace std;
int main(void)
{
long long N;
while (cin >> N)
{
cout << N*N << endl;
}
}
第二題(不能AC,原因未知):
思路:
1.先寫一個(gè)函數(shù)用于判斷兩個(gè)數(shù)是否互質(zhì),
2.如果兩個(gè)數(shù)不互質(zhì),則讓較大的數(shù)為0,不參與之后的判斷,比如12,6,4
12的因數(shù):6,4,3,2
6的因數(shù):3,2
4的因數(shù):2
可知,在兩個(gè)數(shù)不互質(zhì)的情況下,較大的數(shù)具有更多的因數(shù),不互質(zhì)的可能性更大。為了確保結(jié)果有更多的質(zhì)數(shù),在兩個(gè)數(shù)互質(zhì)的情況下要去掉較大的那一個(gè)。
3.數(shù)到最后還剩幾個(gè)不為0的數(shù)。
代碼如下:
#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)//判斷兩個(gè)數(shù)是否互質(zhì)
{
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;
}
第三題:
我在競賽書曾經(jīng)看過一道題,與這道題大同小異,所以非常好做。那道題是判斷a是否能刪除0到多個(gè)字符獲得b,這個(gè)是定死在兩個(gè)字符。
思路:由于b一定是a刪除兩個(gè)得到,則他們的長度必定相差2,如果相差2,則繼續(xù)判斷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;
}