近期简单算法题

近期做的算法题,都是洛谷的题
比较简单
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值