东北农业大学第九届程序设计竞赛 题解

啦啦啦,我现在已经能ak校赛啦,啦啦,一年没白学(大雾)

A:DLK的魔法

分析:这题直接逆推,每次将当前数字尽量变成一个平方数,然后直接平方,直到1
思路:尽量少使用+1操作,就是最优方案,那么就是尽量多平方操作,那么逆推的时候,每次尽量造出平方数
代码:

ll n,a,b,c;
int main()
{
   
    cin>>n;
    if(n<=2)
    cout<<n<<"\n";
    else
    {
   
        do
        {
   
            if(c && n-c*c)
            {
   
                b+=n-c*c+1;
                n=c;
            }
            else
            if(c)
            {
   
                b+=1;
                n=c;
            }
            c=sqrt(n);
        }while((n-c*c || c-1));
        cout<<b<<"\n";
    }
    return 0;
}

B:DLK的题册

分析:?都/2算下呗
代码:

ll a,b;
int main()
{
   
	cin>>a>>b;
	a/=2,b/=2;
	a-=b;
	if(a>0)
	{
   
		cout<<"forward "<<a<<"\n";
	}
	else
	if(a==0)
	{
   
		cout<<"right here\n";
	}
	else
	{
   
		cout<<"backward "<<-a<<"\n";
	}
	return 0;
	//4 5 
	//2 3
	//1
}

C:DLK的队伍

分析:从小到大排一下,每次选第一个,做完了
代码:

ll a[maxn],n,asd,num;
int main()
{
   
	cin>>n;
	rep(i,1,n+1)
	cin>>a[i];
	sort(a+1,a+n+1);
	int l=1;
	rep(i,1,n+1)
	{
   
		num++;
		if(num==a[l])
		{
   
			asd++;
			num=0;
			l=i+1;
		}
	}
	if(num)
	asd++;
	cout<<asd<<"\n";
	return 0;
}

D:DLK的计算器

分析:一开始还以为是个栈,要写后缀表达式之类的,然后发现就一个值每次加减就行
代码:

ll n,x,a;
string s1;
int main()
{
   
	cin>>n;
	while(n--)
	{
   
		cin>>s1;
		switch(s1[1])
		{
   
			case '+':{
   
				cin>>x;
				a+=x;
				break;
			}
			case 'S':{
   
				cin>>x;
				a=x;
				break;
			}
			case 'R':{
   
				cout<<a<<"\n";
				break;
			}
			case '-':{
   
				cin>>x;
				a-=x;
				break;
			}
			case 'C':{
   
				a=0;
				break;
			}
		}
	}
	return 0;
}

E:DLK的游戏

分析:小博弈,最后一堆无意义,看前面的即可,1的时候状态转换,不是1的时候结果已经固定了
代码:

ll n,x,a;
string s1;
int main()
{
   
	cin>>n;
	n--;
	while(n--)
	{
   
		cin>>x;
		if(x==1)
		a^=1;
		else
		{
   
			if(a)
			cout<<"KDL\n";
			else
			cout<<"DLK\n";
			return 0;
		}
	}
	if(a)
	cout<<"KDL\n";
	else
	cout<<"DLK\n";
	return 0;
}

F:DLK的房子

分析:
1000*1000,暴力呗
代码:

int a[maxn];
int val[maxn];
int n,m,q,l,l1,b;
int main()
{
   
 cin>>n>>m;
 rep(i,1,n+1)
 {
   
  cin>>q;
  l=0;
  l1=0;
  while(q--)
  {
   
   cin>>b;
   l1=l;
   l+=b;
   rep(i,l1+1,l)
   {
   
    if(a[i])
    {
   
     val[a[i]]++;
     a[i]=0;
    }
   }
   if(l!=m)
   a[l]++;
  }
 }
 rep(i,1,m+1)
 {
   
  if(a[i])
  {
   
   val[a[i]]++;
   a[i]=0;
  }
 }
 rep(i,1,n+1)
 {
   
  cout<<val[i]<<" ";
 }
 cout<<"\n";
 return 0;
}

G:DLK的照片

分析:emm,直接输出呗。。。
代码:

db a,b,c,d;
int main()
{
   
 cin>>a>>b>>c>>d;
 d=d*a-b*c;
 if(d<0)
 {
   //这是不是要判eps来的,emmmm 
  d=0;
 }
 else
 d/=a;
 cout<<fixed<<setprecision(6)<<d<<"\n";
 return 0;
}

H:DLK的地图

分析:n和m就500,直接遍历
代码:

int n,m;
int dx[4]={
   1,-1,0,0};
int dy[4]={
   0,0,1,-1};
char fx[4]={
   'D','U','R','L'};
int a[maxn][maxn];
char b[maxn][maxn];
bool check(int x,int y)
{
   
    if(x<1 || x>n || y>m || y<1)
    return false;
    return true;
}
void work()
{
   
    rep(i,1,n+1)
    {
   
        rep(j,1,m+1)
        {
   
            if(a[i][j]==0)
            b[i][j]='X';
            else
            {
   
                rep(z,0,4)
                {
   
                    int x1=i+dx[z];
                    int y1=j+dy[z];
                    if(check(x1,y1))
                    {
   
                        if(a[x1][y1]==-1)
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值