近期做的算法题,都是洛谷的题
比较简单
DP 问题
P1002
转移方程是
dp[i][j]=dp[i-1][j]+dp[i][j-1];
代码(错误代码)
#include<iostream>
using namespace std;
int judge[101][101]={0};
struct node
{
int x;
int y;
};
int main()
{ int i=0,j=0;
node a[21];
a[0].x=2;//1
a[0].y=1;
a[1].x=1;//2
a[1].y=2;
a[2].x=-1;//3
a[2].y=2;
a[3].x=-2;//4
a[3].y=1;
a[4].x=-2;//5
a[4].y=-1;
a[5].x=-1;//6
a[5].y=-2;
a[6].x=1;//7
a[6].y=-2;
a[7].x=2;//8
a[7].y=-1;
while(1){
int n=0,m=0,x=0,y=0;
cin>>n>>m;
cin>>x>>y;
int dp[101][101]={0};
for(i=0;i<8;i++)
{ cout<<"x:"<<a[i].x<<" y:"<<a[i].y<<endl;
if(x+a[i].x>=0&&y+a[i].y>=0)
{judge[x+a[i].x][y+a[i].y]=1;
cout<<"judge:"<<judge[x+a[i].x][y+a[i].y]<<endl;
cout<<"judge 1:"<<x+a[i].x<<" judge 2:"<<y+a[i].y<<endl;
}
}
dp[0][1]=1;
dp[1][0]=1;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
/*if(judge[i][j]==1){
continue;}*/
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}}
cout<<dp[n][m]<<endl;}
return 0;
}
修改后
#include<iostream>
using namespace std;
int judge[101][101]={0};
struct node
{
int x;
int y;
};
int main()
{ int i=0,j=0;
node a[21];
a[0].x=2;//1
a[0].y=1;
a[1].x=1;//2
a[1].y=2;
a[2].x=-1;//3
a[2].y=2;
a[3].x=-2;//4
a[3].y=1;
a[4].x=-2;//5
a[4].y=-1;
a[5].x=-1;//6
a[5].y=-2;
a[6].x=1;//7
a[6].y=-2;
a[7].x=2;//8
a[7].y=-1;
int n=0,m=0,x=0,y=0;
cin>>n>>m;
cin>>x>>y;
int dp[101][101]={0};
for(i=0;i<8;i++)
{ cout<<"x:"<<a[i].x<<" y:"<<a[i].y<<endl;
if(x+a[i].x>=0&&y+a[i].y>=0)
{judge[y+a[i].y][x+a[i].x]=1;
cout<<"judge:"<<judge[x+a[i].x][y+a[i].y]<<endl;
cout<<"judge 1:"<<x+a[i].x<<" judge 2:"<<y+a[i].y<<endl;
}
}
dp[0][1]=1;
for(i=1;i<=n+1;i++){
for(j=1;j<=m+1;j++){
if(judge[i-1][j-1]){
dp[i][j]=0;
continue;}
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}}
cout<<dp[n+1][m+1]<<endl;
return 0;
}
Ac代码
(错误原因:1 忘记考虑马也是一个不能走的点 2 不能走的点的x,y坐标错误)
#include<iostream>
using namespace std;
long int judge[101][101]={0};
struct node
{
int x;
int y;
};
int main()
{
int i=0,j=0;
node a[21];
a[0].x=2;//1
a[0].y=1;
a[1].x=1;//2
a[1].y=2;
a[2].x=-1;//3
a[2].y=2;
a[3].x=-2;//4
a[3].y=1;
a[4].x=-2;//5
a[4].y=-1;
a[5].x=-1;//6
a[5].y=-2;
a[6].x=1;//7
a[6].y=-2;
a[7].x=2;//8
a[7].y=-1;
long int n=0,m=0,x=0,y=0;
cin>>n>>m;
cin>>x>>y;
long int dp[101][101]={0};
for(i=0;i<8;i++){
if(x+a[i].x>=0&&y+a[i].y>=0){
judge[x+a[i].x][y+a[i].y]=1;
}}
judge[x][y]=1;
dp[0][1]=1;
for(i=1;i<=n+1;i++){
for(j=1;j<=m+1;j++){
if(judge[i-1][j-1]){
continue;}
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}}
cout<<dp[n+1][m+1]<<endl;
return 0;
}
Time
22/10/16
P1003
错误原因(runtime)
#include<iostream>
using namespace std;
struct node
{
int a;
int b;
int g;
int k;
int flag;
};
int main()
{
int w1=-1;
int h1=-1;
int n=0;
int i=0;
int sflag=0;
cin>>n;
int s=0,w=0;
node m[10005];
for(i=0;i<n;i++)
{
cin>>m[i].a>>m[i].b>>m[i].g>>m[i].k;
m[i].flag=i+1;
}
cin>>s>>w;
for(i=n-1;i>=0;i--)
{
w1=m[i].a+m[i].g;
h1=m[i].b+m[i].k;
if((s>=m[i].a&&s<=w1)&&(w>=m[i].b&&w<=h1))
{
cout<<m[i].flag<<endl;
sflag=1;
break;
}
}
if(sflag!=1)
{
cout<<"-1"<<endl;
}
return 1;
}
Ac代码
之所以runtime 因为返回了错误的值,
这里是因为最后返回的是1,改为返回值0即可。
#include<iostream>
using namespace std;
struct node
{
int a;
int b;
int g;
int k;
int flag;
}m[10001];
int main()
{
int w1=-1;
int h1=-1;
int n=0;
int i=0;
int sflag=0;
cin>>n;
int s=0,w=0;
for(i=0;i<n;i++)
{
cin>>m[i].a>>m[i].b>>m[i].g>>m[i].k;
//m[i].flag=i+1;
}
cin>>s>>w;
for(i=n-1;i>=0;i--)
{
w1=m[i].a+m[i].g;
h1=m[i].b+m[i].k;
if((s>=m[i].a&&s<=w1)&&(w>=m[i].b&&w<=h1))
{
cout<<i+1<<endl;
sflag=1;
break;
}
}
if(sflag!=1)
{
cout<<"-1"<<endl;
}
return 1;
}
p1007
未得满分
#include<iostream>
#include<algorithm>
using namespace std;
int ab[5003];
int L=0,N=0;
int remin(int min)
{
int gg=0;
gg=ab[min];
if(gg>(L-ab[min]+1))
{
gg=L-ab[min]+1;
}
return gg;
}
int main()
{
int i=0,Lmin=-1,Lmax=-1,cen=-1;
cin>>L>>N;
for(i=0;i<N;i++)
{
cin>>ab[i];
}
sort(ab,ab+N);//从0开始,从小到大排序
if(N!=0){
Lmax=L-ab[0]+1;
if(Lmax<ab[N-1])
{
Lmax=ab[N-1];
}
cen=N/2;
Lmin=remin(cen);
if(Lmin<remin(cen+1))
{
Lmin=remin(cen+1);
}
cout<<Lmin<<" "<<Lmax<<endl;}
else
{
cout<<"0"<<" "<<"0"<<endl;
}
return 0;
}
Ac代码
错误原因,思路错误,因为算最短距离应该是距离中点最近的人,而不是中间那个人。
Freopen可以用于输入输出
#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
long int ab[10001];
int L=0,N=0;
int remin(int min)
{
int gg=0;
gg=ab[min];
if(gg>(L-ab[min]+1))
{
gg=L-ab[min]+1;
}
return gg;
}
int main()
{
//freopen("C:\\acm\\in.txt","r",stdin);
int i=0,Lmin=-1,Lmax=-1,cen=-1,flag=-1;
cin>>L>>N;
for(i=0;i<N;i++)
{
cin>>ab[i];
cen=ab[i];
flag=L-ab[i]+1;
if(cen>flag)
{
if(flag>Lmin)
{
Lmin=flag;
}
}else
{
if(cen>Lmin)
{
Lmin=cen;
}
}
}
sort(ab,ab+N);//从0开始,从小到大排序
if(N!=0){
Lmax=L-ab[0]+1;
if(Lmax<ab[N-1])
{
Lmax=ab[N-1];
}
cout<<Lmin<<" "<<Lmax<<endl;}
else
{
cout<<"0"<<" "<<"0"<<endl;
}
return 0;
//fclose(stdin);
}
P1008
Ac代码一次过
拆分暴力破解
#include<iostream>
using namespace std;
int fun(int m1,int m2,int m3)
{
int a[11]={0};
int t1=m1/100;
int t2=(m1/10)%10;
int t3=m1%10;
int t4=m2/100;
int t5=(m2/10)%10;
int t6=m2%10;
int t7=m3/100;
int t8=(m3/10)%10;
int t9=m3%10;
//cout<<t1<<" "<<t2<<" "<<t3<<endl;
a[t1]++;
a[t2]++;
a[t3]++;
a[t4]++;
a[t5]++;
a[t6]++;
a[t7]++;
a[t8]++;
a[t9]++;
if(a[0]>=1)return 1;
for(int i=1;i<10;i++){
if(a[i]>1)
{ //cout<<a[i]<<endl;
return 1;
}}
return 0;
}
int main()
{
for(int i=100;i<400;i++)
{
if(i*3>=1000)break;
if(fun(i,i*2,i*3)==1)continue;
cout<<i<<" "<<i*2<<" "<<i*3<<endl;
}
return 0;
}
P1011
应该可以暴力破解
(ERROR 代码,应该是题意理解有所问题)
#include<iostream>
using namespace std;
int main()
{
int a=0,n=0,m=0,x=0,flag=-1;
cin>>a>>n>>m>>x;
int dp[50]={0};//上车人数
int k=0;//当前人数
k=a;
dp[0]=a;
dp[1]=0;
for(int j=0;j<=a;j++){
dp[1]=j;
for(int i=2;i<n;i++)
{
dp[i]=dp[i-1]+dp[i-2];
k+=dp[i]-dp[i-1];
}
cout<<j<<":"<<k<<endl;
if(k==m)
{
flag=j;
break;
}
}
cout<<"flag:"<<flag<<endl;
}
Ac代码
(错误原因,每次循环未初始化,第二次上下车,如果有人上车后,在该站也可选择下车。)
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int a=0,n=0,m=0,x=0,flag=-1;
cin>>a>>n>>m>>x;
int dp[50]={0};//上车人数
int k=0;//当前人数
k=a;
dp[0]=a;
dp[1]=0;
for(int j=0;j<=10010;j++){
memset(dp,0,sizeof(dp));
dp[1]=j;
dp[0]=a;
k=a;
for(int i=2;i<n-1;i++)
{
dp[i]=dp[i-1]+dp[i-2];
k+=dp[i]-dp[i-1];
//cout<<k<<" th:"<<i<<endl;
}
if(k==m)
{
flag=j;
//cout<<flag<<endl;
break;
}
}
memset(dp,0,sizeof(dp));
dp[0]=a;
dp[1]=flag;
k=a;
for(int i=2;i<x;i++)
{
dp[i]=dp[i-1]+dp[i-2];
k+=dp[i]-dp[i-1];
//cout<<i+1<<"th "<<j<<":"<<k<<endl;
}
cout<<k<<endl;
}