2022河南萌新联赛第(二)场:河南理工大学(赛后总结)

A.妙手

题目大意:

思路:

代码:

B.宝石

题目大意:

思路:

代码:

C.斩龙

题目大意:

思路:

代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
  long long a1,h1,a2,h2,x,a3,h3,k;
    cin>>a1>>h1>>a2>>h2>>x>>k>>a3>>h3;
    int at1=h2/a1+1;
    int at2=h3/a1+1;
     h1-=(h2/a1)*x;
    int sum=at1*(x-k);
    h1-=(k+at1)*a3;
    sum+=k*at1+at2;
    if(h1<=0) cout<<"No Franxx!";
    else{
        cout<<sum;
    }
}

D.数对

题目大意:

思路:

代码:

E.双星

题目大意:

思路:

代码:

F.手办

题目大意:

1-n个手办,求编号为x的手办有多少个(x为n的约数,并且x的2/3次方为有理数)

T组测试数据,输入n

思路:

每个质因数都需要是三次幂,因为平方对三次幂是没有贡献的,原本不是3的倍数,平方之后依旧不是

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int INF=0x3f3f3f3f;
int main(){
	ios::sync_with_stdio(false);
	int n,i,t;
	cin>>t;
	while(t--){
		cin>>n;
		int ans=1;
		for(i=2;i<=1000;i++){
			int num=i*i*i;
			if(num>n)break;
			if(n%num==0) ans++;
		}
		cout<<ans<<endl;
	}
	return 0;
}

G.无限

题目大意:

 给定一个无限集合,已知集合中存在一个1,集合中元素满足以下性质:

  1.  如果x在无限集合中,那么 x×4也在无限集合中。
  2.  如果x在无限集合中,那么 x×2+1也在无限集合中。

问:给定一个正整数p,求无限集合中小于2的p次方的数的个数(对 998244353取模)。 

思路:

看到这道题的第一眼,这玩意儿绝对有规律,于是自己试了一下

1 2 3 4 5.....

1 2 4 7 11......

这不就f[i] = (f[i - 1] + f[i - 2] + 1) % mod;

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10, mod = 998244353;
int f[N];
int n;
int main(){
    cin >> n;
    f[1] = 1;
    f[2] = 2;
    for(int i = 3; i < N; i ++){
        f[i] = (f[i - 1] + f[i - 2] + 1) % mod;
    }
    cout << f[n] << endl;
    return 0;
}

H.0和1

题目大意:

思路:

代码:

I.22数

题目大意:

思路:

代码:

J.签到

题目大意:

在数组找出(可重复)a+b+c=d的数的个数

思路:

思路1:

类似于洛谷的a-b数对,当时就是想到了这个题

思路2:

是自己的方法,方法一想到了没写出来。

a+b+c=d转化为a+b=c-d

分别求出所有的a+b与c-d存到vector中,二分进行比较(直接比较会超时)

不可存到set里面,因为set的insert()函数的时间复杂度为O(logN),而vector的puch_back()函数时间复杂度为O(1)

代码:

方法1:

#include <bits/stdc++.h>
using namespace std;
int n,a[1e3+7];
signed main(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    map<int,bool> mp;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            mp[a[i]+a[j]]=1;
        }
    }
    
    int flag=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(mp[a[i]-a[j]]){
                flag=1;
                break;
            }
        }
        if(flag) break;
    }
    if(flag) cout<<"Yes\n";
    else cout<<"No\n";
    return 0;
}

方法2:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int INF=0x3f3f3f3f;
int n,a[1010];
vector<ll> v1,v2;
int main(){
	ios::sync_with_stdio(false);
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	for(int i=0;i<n;i++){
		for(int j=i;j<n;j++){
			v1.push_back(a[i]+a[j]);
			v2.push_back(abs(a[i]-a[j]));
		}
	}
	sort(v1.begin(),v1.end());
	sort(v2.begin(),v2.end());
//	for(int i=0;i<v1.size();i++){
//		cout<<v1[i]<<" ";
//	}
//	cout<<endl;
//	for(int i=0;i<v2.size();i++){
//	    cout<<v2[i]<<" ";
//	}
//	cout<<endl;
	int len=v1.size();
	for(int i=0;i<len;i++){
		int aa=binary_search(v2.begin(),v2.end(),v1[i]);
		if(aa==1){
			cout<<"Yes"<<endl;
			return 0;
		}
	}
	cout<<"No"<<endl;
	return 0;
}

K.大米

题目大意:

思路:

代码:

L.HPU

题目大意:

从一串字符串中找到HPU,并输出个数

思路:

查找子串在主串中个数,直接把之前写过的稍微改动复制了一下。

代码:

#include<stdio.h>
#include<string.h>
int next[100];
void getNext(char ptn[],int next[])
{
	int len = strlen(ptn);
	next[0] = -1;  //下标0处的初始化
	int k = -1;
	int j = 0;
	while(j<len)    //get_next函数进行升级的点:这里不是j<len-1 而是j<len,这样能够不回溯计数  
	{
		if(k == -1 || ptn[k] == ptn[j])
		{
			j++;
			k++;
			next[j] = k;
		}
		else
		{
			k = next[k];
		}
	}
}
int kmp(char src[],char ptn[])
{
	int len_src = strlen(src);
	int len_ptn = strlen(ptn);
	int i = 0,n = 0,k = 0;  //k应该从0开始,而非-1
	while(i<len_src)
	{
		if(k==-1||src[i]==ptn[k])
		{
			++i;
			++k;
		}
		else
		{
			k=next[k];
		}
		if(k==len_ptn){  //实现不回溯计数
			n++;
			k = next[k];
		}
	}
	return n;
}
int main()
{
	char src[10000010],ptn[4]="HPU";  
	scanf("%s",&src);
	getNext(ptn,next);
	printf("%d",kmp(src,ptn));
 } 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值