水一篇难度偏低(除了暴力就是数学)的博客,有几题题目质量还是不错的!
A. 斐波那契
设f[i]表示斐波那契数论的第i项f[1]=1,f[2] =1,f[i] = f[i - 1] + f[i - 2]
给定一个n
求f[n−1]∗f[n+1]−f[n]^2
1.0版本:我知道它肯定会有爆开的状态,需要化简降低复杂度,所以可以化简为求
f[n-1]^2-f[n]^2+f[n-1]*f[n]。我以为可,还是卡了。
1.1版本:找规律,发现奇数为-1,偶数为1。兴高采烈的写了,又wa了。卡大数。
2.0版本:取末尾判断奇偶。ac。
找规律yyds
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<string>
#include<algorithm>
using namespace std;
typedef long long LL;
LL f[2000];
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
string s;
cin>>s;
if(s[s.size()-1]%2==0) cout<<"1"<<endl;
else cout<<"-1"<<endl;
return 0;
}
B.max
Give two positive integer c, n. You need to find a pair of integer (a,b) satisfy 1<=a,b<=n and the greatest common division of a and b is c.And you need to maximize the product of a and b
给了我们两个数c,n。c指的是a和b的gcd,n是a,b的范围1~n。
让我们求出这样的a,b的最大乘积。
#include<iostream>
#include<cmath>
#include<algorithm>
#include<map>
#include<cstring>
#include<cstdlib>
#include<string>
#include<vector>
using namespace std;
typedef long long LL;
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL c,n;
cin>>c>>n;
if(c>n) cout<<"-1"<<endl;
else
{
LL a=n;
a=n/c*c;
if((a-c)==0) cout<<a*a<<endl;
else cout<<a*(a-c)<<endl;
}
return 0;
}
C.明明的随机数
去重,sort
D.校门外的树
从0~L每个点都种了树,每次砍掉从a到b的树,问还剩多少?
复杂度不高,暴力过一下就好了
E.密码
给定密匙,密文,求明文。
题目不难,但是调试了好久。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
typedef long long LL;
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
//CompleteVictory
//Yvqgpxaimmklongnzfwpvxmniytm
//Wherethereisawillthereisaway
//WheXetNeXeiYawOllZhereiYaway
map<char,int> mp;
mp['a']=0; mp['A']=0;
mp['b']=1; mp['B']=1;
mp['c']=2; mp['C']=2;
mp['d']=3; mp['D']=3;
mp['e']=4; mp['E']=4;
mp['f']=5; mp['F']=5;
mp['g']=6; mp['G']=6;
mp['h']=7; mp['H']=7;
mp['i']=8; mp['I']=8;
mp['j']=9; mp['J']=9;
mp['k']=10; mp['K']=10;
mp['l']=11; mp['L']=11;
mp['m']=12; mp['M']=12;
mp['n']=13; mp['N']=13;
mp['o']=14; mp['O']=14;
mp['p']=15; mp['P']=15;
mp['q']=16; mp['Q']=16;
mp['r']=17; mp['R']=17;
mp['s']=18; mp['S']=18;
mp['t']=19; mp['T']=19;
mp['u']=20; mp['U']=20;
mp['v']=21; mp['V']=21;
mp['w']=22; mp['W']=22;
mp['x']=23; mp['X']=23;
mp['y']=24; mp['Y']=24;
mp['z']=25; mp['Z']=25;
string op;
cin>>op;
int len=op.size();
string idx;
cin>>idx;
for(int i=0;i<idx.size();i++)
{
int tt=i%len;
if(op[tt]=='a'||op[tt]=='A') printf("%c",idx[i]-0);
else if(op[tt]=='b'||op[tt]=='B')
{
if(mp[idx[i]]>=1) printf("%c",idx[i]-1);
else printf("%c",idx[i]+25);
}
else if(op[tt]=='c'||op[tt]=='C')
{
if(mp[idx[i]]>=2) printf("%c",idx[i]-2);
else printf("%c",idx[i]+24);
}
else if(op[tt]=='d'||op[tt]=='D')
{
if(mp[idx[i]]>=3) printf("%c",idx[i]-3);
else printf("%c",idx[i]+23);
}
else if(op[tt]=='e'||op[tt]=='E')
{
if(mp[idx[i]]>=4) printf("%c",idx[i]-4);
else printf("%c",idx[i]+22);
}
else if(op[tt]=='f'||op[tt]=='F')
{
if(mp[idx[i]]>=5) printf("%c",idx[i]-5);
else printf("%c",idx[i]+21);
}
else if(op[tt]=='g'||op[tt]=='G')
{
if(mp[idx[i]]>=6) printf("%c",idx[i]-6);
else printf("%c",idx[i]+20);
}
else if(op[tt]=='h'||op[tt]=='H')
{
if(mp[idx[i]]>=7) printf("%c",idx[i]-7);
else printf("%c",idx[i]+19);
}
else if(op[tt]=='i'||op[tt]=='I')
{
if(mp[idx[i]]>=8) printf("%c",idx[i]-8);
else printf("%c",idx[i]+18);
}
else if(op[tt]=='j'||op[tt]=='J')
{
if(mp[idx[i]]>=9) printf("%c",idx[i]-9);
else printf("%c",idx[i]+17);
}
else if(op[tt]=='k'||op[tt]=='K')
{
if(mp[idx[i]]>=10) printf("%c",idx[i]-10);
else printf("%c",idx[i]+16);
}
else if(op[tt]=='l'||op[tt]=='L')
{
if(mp[idx[i]]>=11) printf("%c",idx[i]-11);
else printf("%c",idx[i]+15);
}
else if(op[tt]=='m'||op[tt]=='M')
{
if(mp[idx[i]]>=12) printf("%c",idx[i]-12);
else printf("%c",idx[i]+14);
}
else if(op[tt]=='n'||op[tt]=='N')
{
if(mp[idx[i]]>=13) printf("%c",idx[i]-13);
else printf("%c",idx[i]+13);
}
else if(op[tt]=='o'||op[tt]=='O')
{
if(mp[idx[i]]>=14) printf("%c",idx[i]-14);
else printf("%c",idx[i]+12);
}
else if(op[tt]=='p'||op[tt]=='P')
{
if(mp[idx[i]]>=15) printf("%c",idx[i]-15);
else printf("%c",idx[i]+11);
}
else if(op[tt]=='q'||op[tt]=='Q')
{
if(mp[idx[i]]>=16) printf("%c",idx[i]-16);
else printf("%c",idx[i]+10);
}
else if(op[tt]=='r'||op[tt]=='R')
{
if(mp[idx[i]]>=17) printf("%c",idx[i]-17);
else printf("%c",idx[i]+9);
}
else if(op[tt]=='s'||op[tt]=='S')
{
if(mp[idx[i]]>=18) printf("%c",idx[i]-18);
else printf("%c",idx[i]+8);
}
else if(op[tt]=='t'||op[tt]=='T')
{
if(mp[idx[i]]>=19) printf("%c",idx[i]-19);
else printf("%c",idx[i]+7);
}
else if(op[tt]=='u'||op[tt]=='U')
{
if(mp[idx[i]]>=20) printf("%c",idx[i]-20);
else printf("%c",idx[i]+6);
}
else if(op[tt]=='v'||op[tt]=='V')
{
if(mp[idx[i]]>=21) printf("%c",idx[i]-21);
else printf("%c",idx[i]+5);
}
else if(op[tt]=='w'||op[tt]=='W')
{
if(mp[idx[i]]>=22) printf("%c",idx[i]-22);
else printf("%c",idx[i]+4);
}
else if(op[tt]=='x'||op[tt]=='X')
{
if(mp[idx[i]]>=23) printf("%c",idx[i]-23);
else printf("%c",idx[i]+3);
}
else if(op[tt]=='y'||op[tt]=='Y')
{
if(mp[idx[i]]>=24) printf("%c",idx[i]-24);
else printf("%c",idx[i]+2);
}
else if(op[tt]=='z'||op[tt]=='Z')
{
if(mp[idx[i]]>=25) printf("%c",idx[i]-25);
else printf("%c",idx[i]+1);
}
}
return 0;
}
F.金币
k天得了多少金币?i*i i*n
G.买铅笔
(一盒)a根铅笔b块钱,我要买c根,3种买哪一种最少钱?
H.成绩
*0.2+*0.3+*0.5
I.Cities
开long long就行惹
#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long LL;
LL a[200200];
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL t;
cin>>t;
while(t--)
{
LL n;
cin>>n;
LL minn=0x3f3f3f3f;
LL flag=0;
for(LL i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]<minn) minn=a[i],flag=i;
}
LL sum=0;
for(LL i=1;i<=n;i++)
{
if(i!=flag) sum+=minn+a[i];
else continue;
}
cout<<sum<<endl;
}
return 0;
}
J.输出‘Z’
-->
./.
<--
K.五子棋
求五子棋的输赢。
一开始想用dfs跑一下,后来觉得这样也太费事了,直接枚举吧,虽然它有上下左右左上左下右上右下八个方位,但是由于是从前往后枚举,所以直接把一半留下就行(左下+右下+右+下)
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<string>
#include<map>
using namespace std;
char a[2002][2002];
int main()
{
//cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
}
}
bool flagw=false;
bool flagb=false;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]=='w')
{
if(j+4<=n&&a[i][j+1]=='w'&&a[i][j+2]=='w'&&a[i][j+3]=='w'&&a[i][j+4]=='w') flagw=true;
else if(i+4<=n&&a[i+1][j]=='w'&&a[i+2][j]=='w'&&a[i+3][j]=='w'&&a[i+4][j]=='w') flagw=true;
else if(i+4<=n&&j+4<=n&&a[i+1][j+1]=='w'&&a[i+2][j+2]=='w'&&a[i+3][j+3]=='w'&&a[i+4][j+4]=='w') flagw=true;
else if(i+4<=n&&j-4>=0&&a[i+1][j-1]=='w'&&a[i+2][j-2]=='w'&&a[i+3][j-3]=='w'&&a[i+4][j-4]=='w') flagw=true;
if(flagw==true) break;
}
else if(a[i][j]=='b')
{
if(j+4<=n&&a[i][j+1]=='b'&&a[i][j+2]=='b'&&a[i][j+3]=='b'&&a[i][j+4]=='b') flagb=true;
else if(i+4<=n&&a[i+1][j]=='b'&&a[i+2][j]=='b'&&a[i+3][j]=='b'&&a[i+4][j]=='b') flagb=true;
else if(i+4<=n&&j+4<=n&&a[i+1][j+1]=='b'&&a[i+2][j+2]=='b'&&a[i+3][j+3]=='b'&&a[i+4][j+4]=='b') flagb=true;
else if(i+4<=n&&j-4>=0&&a[i+1][j-1]=='b'&&a[i+2][j-2]=='b'&&a[i+3][j-3]=='b'&&a[i+4][j-4]=='b') flagb=true;
if(flagb==true) break;
}
if(flagw==true||flagb==true) break;
}
if(flagw==true||flagb==true) break;
}
if(flagw==true) cout<<"FYMNB"<<endl;
else if(flagb==true) cout<<"DDNB"<<endl;
else cout<<"PINGJU"<<endl;
}
return 0;
}
L.三的倍数
给你两个正整数L, R, 然后把L到R之间的数连起来形成一个新的数x。判断x是不是3的倍数。
例如:L = 2, R = 4, 则 x = 234; L = 10, R =12, x = 101112.
可以发现,3个3个的时候可以直接组成3的倍数,所以直接求余特判即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
typedef long long LL;
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL t;
cin>>t;
while(t--)
{
LL a,b;
cin>>a>>b;
LL sum=(b-a)+1;
if(sum%3==0) cout<<"YES"<<endl;
else if(sum%3==1)
{
if(a%3==0) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
else
{
if((a%3+(a+1)%3)%3==0) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
return 0;
}