纪中Day5比赛总结
今天比赛突然蹦进了前十,连我自己都不敢相信(今天考那么好,明天rp必定爆掉 )
T1
看到这道题的第一眼,我以为要用DFS来做,又看到有一个最后必须回到道路,觉得有些难度,先去做了T3。
回来后,仔细看了一下题目,发现题中有下面这句话:
先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生
所以,这道题可以用暴力来做。用一个结构体保存植株的花生个数和它的坐标,然后以花生的个数从大到小排序。排完序后,从最大的开始,枚举从当前点到每一棵植株并且采摘、返回到路旁的时间是否足够,如果不足够,直接退出枚举,结束程序。
Code
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,k,t=0;
int money=0,p[30][30];
struct hs
{
int x,y,num;
};
bool cmp(hs x1,hs y1)
{
return x1.num>y1.num;
}
int main()
{
hs a[500];
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>p[i][j];
if(p[i][j]!=0)
{
t++;
a[t].x=i;
a[t].y=j;
a[t].num=p[i][j];//记录植株的坐标以及花生数量
}
}
sort(a+1,a+t+1,cmp);
for(int i=1;i<=t;i++)
{
if(i==1)
{
if(a[i].x+1+a[i].x<=k)
{
money+=a[i].num;
k=k-(a[i].x+1);
}
else break;
}
else
{
if(abs(a[i].x-a[i-1].x)+abs(a[i].y-a[i-1].y)+a[i].x+1<=k)//枚举每个植株
{
money+=a[i].num;
k=k-(abs(a[i].x-a[i-1].x)+abs(a[i].y-a[i-1].y)+1);
}
else break;
}
}
cout<<money;
}
T2
这道题直接就是一个递归+二分,或者用双重循环也可以做。但无奈我太菜了,居然没想出来,直接打表了。
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
string a,b;
char dg(int l,int r)
{
int mid;
char lt,rt,ans;
if(l==r)
{
cout<<b[l];
return b[l];
}
mid=(l+r)/2;
lt=dg(l,mid);//二分查找左边
rt=dg(mid+1,r);//二分查找右边
if(rt==lt)
ans=rt;
else ans='F';
cout<<ans;
return ans;//判断父节点并返回
}
int main()
{
cin>>n;
m=1;
for(int i=1;i<=n;i++)
m=m*2;
cin>>a;
for(int i=0;i<a.size();i++)
{
if(a[i]=='1') b[i+1]='I';
else b[i+1]='B';
}
dg(1,m);
return 0;
}
T2
一看题,蒟蒻狂喜。这不就是大水题吗?直接DFS就过掉了(正解全排列不会....)
Code
#include<iostream>
#include<cstdlib>
using namespace std;
int x,m,n,a[10005],b[10005];
bool f[10005];
void dfs(int dep)
{
if(dep>n)
{
x++;
if(x>m)//查看是第几大的数
{
for(int i=1;i<n;i++)
cout<<b[i]<<' ';
cout<<b[n];
exit(0);
}
return;
}
int k=1;
if(x==0) k=a[dep];
for(int i=k;i<=n;i++)
if(f[i]!=1)
{
f[i]=1;
b[dep]=i;
dfs(dep+1);
f[i]=0;
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
dfs(1);
}
T4
入眼一看,这不就是高精度吗?!但仔细一看,P那么大!肯定会超时,但无奈本蒟蒻太菜了,只能冲着部分分去了。最后的正解是高精度+快速幂。
Code
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int p,a[1010],t=0,k=0,b[1010];
void input()
{
memset(a,0,sizeof(a));
cin>>p;
}
void gjc()
{
a[1000]=1;
for(int i=1;i<=p;i++)
{
t=0;
k=0;
for(int j=1000;j>=1;j--)
{
k=(a[j]*2+t)/10;
a[j]=(a[j]*2+t)%10;
t=k;
}
}
}
void gjj()
{
t=0;
b[1000]=1;
for(int j=1000;j>=1;j--)
{
if(a[j]-t-b[j]<0)
{
t=1;
a[j]=a[j]*10-b[j];
}
else a[j]=a[j]-t-b[j];
}
}
int main()
{
input();
gjc();
gjj();
k=0;
for(int i=1;i<=1000;i++)
{
if(a[i]!=0)
{
k=i;
break;
}
}
cout<<1000-(k-1)<<endl;
for(int i=501;i<=1000;i++)
{
cout<<a[i];
}
return 0;
}
总结
总体还算不错,但是第一题有一个细节没考虑到,白给10分。个人感觉基础还算扎实,但是网络流什么的就有点拉胯了....
本人的csdn博客