河南萌新联赛2024第(六)场:郑州大学

A 装备二选一(一)

题目描述

手中的武器会为他增加 a% 的暴击率,发生暴击时会使他本次普通攻击伤害变为原来的 b 倍。
打完boss之后掉落的武器会为他增加 c% 的暴击率,发生暴击时会使他本次普通攻击伤害变为来的 d倍。

思路

就是比较一下伤害

代码

int main() 
{
    double a, b, c, d;
    cin >> a >> b >> c >> d;
    double bc = 1.0 + a / 100.0 * (b - 1.0);//基础伤害+发生暴击时的伤害
    double bn = 1.0 + c / 100.0 * (d - 1.0);
    if (bn > bc) 
        cout << "YES"; 
    else 
        cout << "NO"; 
    return 0;
}

B 百变吗喽

题目描述

两个字符串,第一个比第二个少一个字母,在任意一个地方添加一个字母两个字符串是否能一样

思路

判断一下两个字符串在缺少的地方之前或者后面是否完全一样,如果一样证明可以添加一个字母之后完全一样,就在这个地方添加就行,不然直接输出0

代码

int main()
{
    string s,t;int i,j;
    cin>>s>>t;
    s=" "+s;//因为从一开始,从0就不用
    t=" "+t;
    for( i=1;i<=s.size()&&s[i]==t[i];i++);//两个循环判断可以添加的区间
    for( j=t.size();j>=1&&s[j-1]==t[j];j--);
    if(j<=i)
    {
        cout<<i-j+1<<endl;
        for(int k=j;k<=i;k++)//区间内完成添加
            cout<<k-1<<' '<<t[k]<<endl;
    }
    else
        cout<<0<<endl;
    return 0;
}

C 16进制世界

题目描述

有n个月饼,对于每个月饼i,饱食度为v i​ ,幸福度𝑤𝑖 。现在有m饱度,意味着他吃的月饼的饱食度之和不大于m。但是由于身处16进制的世界,他吃的月饼的幸福度之和必须是16的倍数。算一下最多吃的月饼的量。

思路

背包思想如果两个数 加起来是的倍数,只需要 模 的余数加起来是 的倍数,同理可以拓展到多个数相加以及递归地将 拆成其他几个数的和。这样我们的就没必要存储幸福度,而只需要存储幸福度模 后的余数即可。

代码

int main()
{
	long long n,m,x,y;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
    {
		cin>>x>>y;
        y=y%16;//求余
		for(int j=m;j>=x;j--)
			for(int k=15;k>=0;k--)
            {
				long long ne=(k-y+16)%16;
				if(dp[j-x][ne]||ne==0)//更新最大值
					dp[j][k]=max(dp[j][k],dp[j-x][ne]+1);
			}
	}
	cout<<dp[m][0];
	return 0;
}

D 四散而逃

题目描述

一个由n个格子排成一行的走廊,每个格子有a个人,每次可以从一个格子同时向两边跑(两个人必须是同一个格子)多少次可以都在两边

思路

当n=3,中间是奇数的时候就不行了,偶数可以,n>3中间只要有一个大于1,就可以,因为可以向它两边的任意位置跑,但是中间有奇数计算数量要多一次

代码

long long a[200600];
signed main() 
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> a[i];
    int res = 0, sum = 0;
    for (int i = 1; i < n - 1; i++)
        sum += a[i]/2;计算总数
    int ff=0;
     for (int i = 1; i < n - 1; i++)
        if(a[i]>1)//判断是否有大于1的数
            ff=1;
    for (int i = 1; i < n - 1; i++) 
        if (a[i] % 2!= 0)
            res++;//奇数+1;
    res=res+sum;
    if ((n == 3 && a[1] % 2!= 0)||ff==0) //n=1特判
        res = -1;
    cout << res << '\n';
    return 0;
}

F 追寻光的方向

题目描述

小G所在的道路上排列着n个路灯,每个路灯发出的光亮为li 。由于视野问题,每次只能看到前方最亮的那盏灯的位置,(若前方有多个亮度值最大,则只会跑到第一个亮度值最大的位置)所以小G每次冲到最亮的那盏灯下,然后进行一次休息。现如今小G正在第一个路灯下,小G到达第n个路灯下,需要休息几次?

思路

可以倒着看看一下比最后一个数大或者等于它的有多少,当遇到的时候更新一下最后这个数的值,作最大值

代码

signed main()
{
    int n;
    cin>>n;
    int a[n+30];
    for(int i=0;i<n;i++)
        cin>>a[i];
    int ans=0;
    int maxx=a[n-1];
    for(int j=n-1;j>=1;j--)
    {
    	if(a[j]>=maxx)
    	   ans++;//更新数量
        maxx=max(maxx,a[j]);  
    }
    cout<<ans-1;//算出的是最大值的台灯数,问的是休息几次,所以最后减一
    return 0;
}
}

G 等公交车

题目描述

多个公交站点,一个人到达某个站点时,等待几分钟共交车能够到达

思路

首先判断一下,完全赶不上的,然后判断最近时刻的车是否能赶上

代码

const int N=1e5+11;
int d[N],t[N];
int main()
{
    int n,m;int q;
    cin>>n>>m;
    for(int i=1;i<=n;i++)  cin>>d[i];
    for(int i=1;i<=m;i++)  cin>>t[i];
    cin>>q;
    while(q--)
    {
        int tt,x;
        cin>>tt>>x;
        int s=d[x]+t[m];//最晚的车人需要几分钟到达站点等待
        if(tt>s) cout<<"TNT"<<'\n';
        else 
            for(int i=1;i<=m;i++)
                if(d[x]+t[i]>=tt)//判断最短时间的
                {
                    cout<<d[x]+t[i]-tt<<'\n';
                    break;
                }
    }
    return 0;
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值