百练OJ——2019研究生推免上机考试笔记

这两天在刷题,就写一篇博客水水。没全做完,看到最后三题做的人不多就先不做了(捂脸)。
传送门:2019研究生推免上机考试

A:有趣的跳跃

简单的模拟

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

int a[3005],b[3005];
int n;
bool judge()
{
    
    
	for(int i=1;i<=n-1;i++)
	{
    
    
		if(b[i]!=i)
		{
    
    
			return false;
		}
	}
	return true;
}

int main()
{
    
    
	cin>>n;
	for(int i=1;i<=n;i++)
	{
    
    
		cin>>a[i];
	}
	for(int i=1;i<=n-1;i++)
	{
    
    
		b[i]=abs(a[i+1]-a[i]);
	}
	sort(b+1,b+n);
	if(judge())
	{
    
    
		cout<<"Jolly"<<endl;
	}
	else
	{
    
    
		cout<<"Not jolly"<<endl;
	}
	return 0;
}

B:玛雅历

稍微复杂的模拟,就是日期之间来回的倒腾(审题)

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;

string a[]={
    
    "pop", "no", "zip", "zotz", "tzec", 
			"xul", "yoxkin", "mol", "chen", "yax", 
			"zac", "ceh", "mac", "kankin", "muan", "pax", "koyab", "cumhu","uayet"};
string b[]={
    
    "imix", "ik", "akbal", "kan", "chicchan", 
			"cimi", "manik", "lamat", "muluk", "ok", 
			"chuen", "eb", "ben", "ix", "mem", "cib", 
			"caban", "eznab", "canac", "ahau"};

int f(string s)
{
    
    
	for(int i=0;i<19;i++)
	{
    
    
		if(a[i]==s)
		{
    
    
			return i;
		}
	}
	return 0;
}

int main()
{
    
    
	int t;
	cin>>t;
	cout<<t<<endl;
	for(int i=0;i<t;i++)
	{
    
    
		int a1,a3,b1,b3;
		string a2,b2;
		cin>>a1;
		getchar();
		cin>>a2>>a3;
		int pos1=f(a2);
		int day=a3*365+pos1*20+a1;
		b3=(day/260);
		b1=(day%260)%13+1;
		int pos2=(day%260)%20;
		b2=b[pos2];
		cout<<b1<<" "<<b2<<" "<<b3<<endl;
	}
	return 0;
} 

C:走迷宫

bfs走起

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<queue>
using namespace std;

int n,m;
int dir[4][2]={
    
    {
    
    -1,0},{
    
    1,0},{
    
    0,-1},{
    
    0,1}};
string maze[110];
bool vis[110][110];

struct node
{
    
    
	int x;
	int y;
	int d;
	node(int xx,int yy,int dd)
	{
    
    
		x=xx;
		y=yy;
		d=dd;
	}
};

bool in(int x,int y)
{
    
    
	return 0<=x&&x<n&&0<=y&&y<m; 
}

int bfs()
{
    
    
	queue<node> q;
	vis[0][0]=true;
	q.push(node(0,0,0));
	while(!q.empty())
	{
    
    
		node now=q.front();
		q.pop();
		if(now.x==n-1&&now.y==m-1)
		{
    
    
			return now.d;
		}
		for(int i=0;i<4;i++)
		{
    
    
			int tx=now.x+dir[i][0];
			int ty=now.y+dir[i][1];
			if(in(tx,ty)&&!vis[tx][ty]&&maze[tx][ty]!='#')
			{
    
    
				vis[tx][ty]=true;
				q.push(node(tx,ty,now.d+1));
			}
		}
	}
	return -1;
}

int main()
{
    
    
	cin>>n>>m;
	for(int i=0;i<n;i++)
	{
    
    
		cin>>maze[i];
	}
	cout<<bfs()+1<<endl;
	return 0;
}

D:最大上升子序列和

dp最长上升子序列的变形,也不难

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

int a[1005],dp[1005];
int n;

int main()
{
    
    
	cin>>n;
	for(int i=1;i<=n;i++)
	{
    
    
		cin>>a[i];
		dp[i]=a[i];
	}
	int ans=0;
	for(int i=1;i<=n;i++)
	{
    
    
		for(int j=1;j<=i-1;j++)
		{
    
    
			if(a[j]<a[i])
			{
    
    
				dp[i]=max(dp[i],dp[j]+a[i]);
			}
		}
		ans=max(ans,dp[i]);
	}
	cout<<ans<<endl;
	return 0;
}

E:Yogurt factory

贪心

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

long long c[10005],y[10005];
bool vis[10005];

int main()
{
    
    
	int n;
	long long s;
	cin>>n>>s;
	for(int i=0;i<n;i++)
	{
    
    
		cin>>c[i]>>y[i];
	}
	long long ans=0;
	for(int i=0;i<n;i++)
	{
    
    
		if(!vis[i])
		{
    
    
			vis[i]=true;
			ans+=c[i]*y[i];
		}
		for(int j=i+1;j<n;j++)
		{
    
    
			if(!vis[j])
			{
    
    
				if(c[i]*y[j]+s*(j-i)*y[j]<c[j]*y[j])
				{
    
    
					vis[j]=true;
					ans+=c[i]*y[j]+s*(j-i)*y[j];
				}
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

F题之后的有时间再搞吧。。。最近学院好像要开始确定保研名额了。

猜你喜欢

转载自blog.csdn.net/weixin_41650348/article/details/108517864