分治
B2064 斐波那契数列
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
double a[1000];
int main()
{
int n;
cin>>n;
a[0]=1.0;
a[1]=1.0;
for(int i=2;i<=50;i++)
a[i]=a[i-1]+a[i-2];
cout<<fixed<<setprecision(2)<<a[n-1];
return 0;
}
P1024 [NOIP 2001 提高组] 一元三次方程求解
#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;
int main()
{
double a,b,c,d;
double as,bs,t,si;
double x1,x2,x3;
cin>>a>>b>>c>>d;
as=b*b-3*a*c;
bs=b*c-9*a*d;
t=(2*as*b-3*a*bs)/(2*sqrt(as*as*as));
si=acos(t);
x1=(-b-2*sqrt(as)*cos(si/3))/(3*a);
x2=(-b+sqrt(as)*(cos(si/3)+sqrt(3)*sin(si/3)))/(3*a);
x3=(-b+sqrt(as)*(cos(si/3)-sqrt(3)*sin(si/3)))/(3*a);
cout<<fixed<<setprecision(2)<<x1<<" ";
cout<<fixed<<setprecision(2)<<x3<<" ";
cout<<fixed<<setprecision(2)<<x2<<" ";
return 0;
}
P2516 [HAOI2010] 最长公共子序列
#include<bits/stdc++.h>
#define RG register
#define I inline
#define R RG int
#define G c=getchar()
using namespace std;
typedef long long LL;
const int N=5009,YL=1e8;
char x[N],y[N];
int ff[N],gg[N],mff[N],mgg[N];
int main(){
scanf("%s%s",x+1,y+1);
R n=strlen(x+1)-1,m=strlen(y+1)-1,i,j,*f=ff,*g=gg,*mf=mff,*mg=mgg;
g[0]=1;for(j=0;j<=m;++j)f[j]=1;
for(i=1;i<=n;++i,swap(f,g),swap(mf,mg)){
memset(g +1,0,m<<2);
memset(mg+1,0,m<<2);
for(j=1;j<=m;++j){
if(x[i]==y[j])mg[j]=mf[j-1]+1,g[j]=f[j-1];
if(mf[j]>mg[j])mg[j]=mf[j],g[j]=f[j];
else if(mf[j]==mg[j])(g[j]+=f[j])%=YL;
if(mg[j-1]>mg[j])mg[j]=mg[j-1],g[j]=g[j-1];
else if(mg[j-1]==mg[j])(g[j]+=g[j-1])%=YL;
if(mf[j-1]==mg[j])(g[j]+=YL-f[j-1])%=YL;
}
}
printf("%d\n%d\n",mf[m],f[m]);
return 0;
}
P1880 [NOI1995] 石子合并
#include<iostream>
#include<cstdio>
using namespace std;
int a[2005],sum[2005];
int fmi[2005][2005],fma[2005][2005],
smi[2005][2005];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
a[i+n]=a[i];
sum[i]=sum[i-1]+a[i];
smi[i][i]=i;
}
for(int i=1+n;i<=(n<<1);i++){
sum[i]=sum[i-1]+a[i];
smi[i][i]=i;
}
for(int i=(n<<1)-1;i;i--)
for(int j=i+1;j<=(n<<1);j++){
int jc=0,tmp=0x3f3f3f3f;
fma[i][j]=max(fma[i][j-1],fma[i+1][j])+sum[j]-sum[i-1];
for(int k=smi[i][j-1];k<=smi[i+1][j];k++){
int tt=fmi[i][k]+fmi[k+1][j]+(sum[j]-sum[i-1]);
if(tt<tmp){
tmp=tt;
jc=k;
}
}
smi[i][j]=jc;
fmi[i][j]=tmp;
}
int ama=0,ami=0x3f3f3f3f;
for(int i=1;i<=n;i++){
ama=max(ama,fma[i][i+n-1]);
ami=min(ami,fmi[i][i+n-1]);
}
printf("%d\n%d",ami,ama);
return 0;
}
B2034 计算 2 的幂
#include <iostream>
#include <cstdio>
#include <cmath>
#define AUTHOR "HEX9CF"
using namespace std;
int main()
{
unsigned int n;
cin >> n;
long p = pow(2, n);
cout << p;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
double a[1000];
int main()
{
int n;
cin>>n;
a[0]=1.0;
a[1]=1.0;
for(int i=2;i<=50;i++)
a[i]=a[i-1]+a[i-2];
cout<<fixed<<setprecision(2)<<a[n-1];
return 0;
}
P1024 [NOIP 2001 提高组] 一元三次方程求解
#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;
int main()
{
double a,b,c,d;
double as,bs,t,si;
double x1,x2,x3;
cin>>a>>b>>c>>d;
as=b*b-3*a*c;
bs=b*c-9*a*d;
t=(2*as*b-3*a*bs)/(2*sqrt(as*as*as));
si=acos(t);
x1=(-b-2*sqrt(as)*cos(si/3))/(3*a);
x2=(-b+sqrt(as)*(cos(si/3)+sqrt(3)*sin(si/3)))/(3*a);
x3=(-b+sqrt(as)*(cos(si/3)-sqrt(3)*sin(si/3)))/(3*a);
cout<<fixed<<setprecision(2)<<x1<<" ";
cout<<fixed<<setprecision(2)<<x3<<" ";
cout<<fixed<<setprecision(2)<<x2<<" ";
return 0;
}
P2516 [HAOI2010] 最长公共子序列
#include<bits/stdc++.h>
#define RG register
#define I inline
#define R RG int
#define G c=getchar()
using namespace std;
typedef long long LL;
const int N=5009,YL=1e8;
char x[N],y[N];
int ff[N],gg[N],mff[N],mgg[N];
int main(){
scanf("%s%s",x+1,y+1);
R n=strlen(x+1)-1,m=strlen(y+1)-1,i,j,*f=ff,*g=gg,*mf=mff,*mg=mgg;
g[0]=1;for(j=0;j<=m;++j)f[j]=1;
for(i=1;i<=n;++i,swap(f,g),swap(mf,mg)){
memset(g +1,0,m<<2);
memset(mg+1,0,m<<2);
for(j=1;j<=m;++j){
if(x[i]==y[j])mg[j]=mf[j-1]+1,g[j]=f[j-1];
if(mf[j]>mg[j])mg[j]=mf[j],g[j]=f[j];
else if(mf[j]==mg[j])(g[j]+=f[j])%=YL;
if(mg[j-1]>mg[j])mg[j]=mg[j-1],g[j]=g[j-1];
else if(mg[j-1]==mg[j])(g[j]+=g[j-1])%=YL;
if(mf[j-1]==mg[j])(g[j]+=YL-f[j-1])%=YL;
}
}
printf("%d\n%d\n",mf[m],f[m]);
return 0;
}
P1880 [NOI1995] 石子合并
#include<iostream>
#include<cstdio>
using namespace std;
int a[2005],sum[2005];
int fmi[2005][2005],fma[2005][2005],
smi[2005][2005];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
a[i+n]=a[i];
sum[i]=sum[i-1]+a[i];
smi[i][i]=i;
}
for(int i=1+n;i<=(n<<1);i++){
sum[i]=sum[i-1]+a[i];
smi[i][i]=i;
}
for(int i=(n<<1)-1;i;i--)
for(int j=i+1;j<=(n<<1);j++){
int jc=0,tmp=0x3f3f3f3f;
fma[i][j]=max(fma[i][j-1],fma[i+1][j])+sum[j]-sum[i-1];
for(int k=smi[i][j-1];k<=smi[i+1][j];k++){
int tt=fmi[i][k]+fmi[k+1][j]+(sum[j]-sum[i-1]);
if(tt<tmp){
tmp=tt;
jc=k;
}
}
smi[i][j]=jc;
fmi[i][j]=tmp;
}
int ama=0,ami=0x3f3f3f3f;
for(int i=1;i<=n;i++){
ama=max(ama,fma[i][i+n-1]);
ami=min(ami,fmi[i][i+n-1]);
}
printf("%d\n%d",ami,ama);
return 0;
}
B2034 计算 2 的幂
#include <iostream>
#include <cstdio>
#include <cmath>
#define AUTHOR "HEX9CF"
using namespace std;
int main()
{
unsigned int n;
cin >> n;
long p = pow(2, n);
cout << p;
return 0;
}
全部评论
相关推荐
