这两天在刷题,就写一篇博客水水。没全做完,看到最后三题做的人不多就先不做了(捂脸)。
传送门: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题之后的有时间再搞吧。。。最近学院好像要开始确定保研名额了。