第二十一届宁波大学程序设计竞赛(同步赛) A,B,D,F,H题解

链接:

第二十一届宁波大学程序设计竞赛(同步赛)_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com)

A:直接输出 不多解释

B:

B-Love You Guys_第二十一届宁波大学程序设计竞赛(同步赛) (nowcoder.com)

#include<bits/stdc++.h>
using namespace std;

int x,y,a,b; 

int main()
{
	cin>>x>>y>>a>>b;
	int cnt=a;
	int num=0;
	int X=x;
	while(x>=0)
	{
		x-=cnt+num*b;
		num++;
		x+=y;
		//cout<<x<<endl;
		//if(x<0) break;
		if(x>=X) x=X;
	}
	if(num!=0)cout<<num<<endl;
    else cout<<1<<endl;
	return 0;
}

注意 可能一开始就过挂科了 所以对num==0 特判一下;

D:

D-爱丽丝,来扫除啦!(Easy Version)_第二十一届宁波大学程序设计竞赛(同步赛) (nowcoder.com)

#include<bits/stdc++.h>
using namespace std;

int n;
map<double,int>mp;
map<double,int>mp2;
int a[10];
int main()
{
    int mx=-1;
    cin>>n;
    int f=0;
    while(n--)
    {
        double x,y;
        cin>>x>>y;
        if(x==0.0&&y==0.0) 
        {
            f++;
            continue;
        }
        else if(x==0.0)
		{
			if(y>0) a[0]++;
			else a[1]++;
			
		} 
		else if(y==0.0)
		{
			if(x>0) a[2]++;
			else a[3]++;
		} 
        else
        {
            double num=y/x;
           if(x>0&&y>0||x<0&&y>0)
           {
		   		mp[num]++;
		   		mx=max(mp[num],mx);
		   }
		   else 
		   {
		   		mp2[num]++;
			   	mx=max(mp2[num],mx);
		   }
        }
    }
   	sort(a,a+4,greater<int>());
   	mx=max(mx,a[0]);
    cout<<mx+f<<endl;
    
    
    
    return 0;
}

射线经过的点集合可以根据斜率来合并点的集合,用map 来计数。

因为存在x==0或y==0的情况,所又用了a数组来存储。

题目数据比较细节,若出现(0,0)那么所有点是都可以经过的 所以mx++。

另外因为是射线,所以是要按区间分的。

F:

F-奇数Alice偶数Bob!_第二十一届宁波大学程序设计竞赛(同步赛) (nowcoder.com)

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

int n;


int main()
{
	cin>>n;
	vector<int>a;
	for(int i=0;i<n;i++)
	{
		int x;
		cin>>x;
		a.push_back(x); 
	}
	if(n%2==1) cout<<"Yukimi"<<endl; 
	else{
		sort(a.begin(),a.end());
		int mn=a[0];
		int cnt=n;
		for(int i=1;i<n;i++)
		{
			if(a[i]!=mn) cnt++;
		}
		//cout<<cnt<<endl;
		if(cnt%2==1) cout<<"Yukimi"<<endl;
		else cout<<"LCF"<<endl;
	}
	
	
	return 0;
}

有点博弈的感觉,我还没怎么接触过这类题,好在这题比较好过。

首先分石头总的堆数,若是奇数就直接胜利。

什么?为什么?

其实要赢的话 就是维护石头非零堆数为偶数的过程(对手选的时候为偶数堆),一开始就是奇数的话 直接选任意一堆变为0 对手不得不跟着你把石堆变成0 最后一步必然是你选的,那么对手必输。

那偶数呢?一定会输吗? 不!会赢的!(可能)

由于先手是我方选择,那么就可以将其他非最小的石堆变成当前最小值,这样对手回合又是偶数堆了,但对手同样也可以这样干,就这样两方不断维护偶数石堆,但最小值必然会全部变成一样,这样双方就只能把石堆的数值变成0(反正最后肯定会变成0,省去过程了)

那这样就只要计数 看有多少次非最小的石堆供我方选择。

若为奇数,其实就是和石堆数为奇数时一样了,胜利!

若为偶数,很遗憾,失败 QWQ。

H:

H-后缀0_第二十一届宁波大学程序设计竞赛(同步赛) (nowcoder.com)

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;



int main()
{
 	ll t;
 	cin>>t;
 	while(t--)
 	{	
 		ll n;
	 	cin>>n;
		if(n<=3) cout<<0<<endl;
		else
		{
			n=n-3+5-1;
			ll cnt=0;
			while(n)
			{
				
				cnt+=n/5;
				n=n/5;
			}
			cout<<cnt<<endl;
		}
	}
 	
	 return 0;
}

打表找规律 (如果你很强 通过数学方法 证明出来了 我承认,你很强   qwq)

1-3    为 0

之后每5一组

但要注意 每隔5^n那组数值都会多1   (最后写的时候猜出来的  毕竟要接近答案 哈哈)

其他题目还没写出来 有时间会补(应该)

看到这里了 点个赞吧  !

THE  END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值