信息与未来2024市赛(徐州)

信息与未来2024市赛(徐州)

A - n的7倍

我不明白为什么有二十几个0分的

按题意模拟即可
#include<bits/stdc++.h>
using namespace std;
int main(){
	int n ;
	cin>>n;
	cout<<7*n<<endl;
	return 0;
}

B - 数位合一

题目: 把一个数上所有数位的数进行求和

思路:拆数位时用字符串的方式与整除取余的方式都可以。(又是一道水题)
#include<bits/stdc++.h>
using namespace std;
int main(){
	long long n;
	cin>>n;
	int ans = 0;
	while(n){
		ans+=n%10;
		n/=10;
	}
	cout<<ans<<endl;
	return 0;
}

C - 第二大的质数

我旁边那个小孩不知道质数是什么……

求小于等于n的第二大质数

思路:因为题目没有标明数据的范围,所以用试除法从n开始倒序判定质数
#include<bits/stdc++.h>
using namespace std;
bool is_prime(int n){//判断是否为质数
	if (n < 2) return false;
	for (int i = 2; i*i <= n ;i++)
		if (n % i == 0) return false;
	return true;
}
int main(){
	int n ;
	cin>>n;
	if(n<=2)cout<<"no"<<endl;
	else{
		int cnt = 0;
		for(int i = n; i >1; i --){
			if(is_prime(i))cnt++;
			if(cnt==2){
				cout<<i<<endl;
				break;
			}
		}
	}
	return 0;
}

D - 01背包

好事是这是一道裸的01背包,坏消息是我把模板忘了,推了半小时还是0分

思路:看上去是贪心,实际是道DP,不会做的建议去网上找一下01背包的教程。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e7+7;
int dp[N];
int main(){
	int n,m;
	cin>>m>>n;
	for(int i=0;i<n;i++){
		int v,w;
		cin>>v>>w;
		for(int j=m;j>=v;j--)
			dp[j]=max(dp[j],dp[j-v]+w);
	}
	cout<<dp[m];
	return 0;
}

E - 填充单词

我太弱了,比赛时直接放弃
限制条件有三个,1、不能有三个辅音连在一起,2、不能有三个元音连在一起,3、字符串中必须有“L”。于是我们可以把字符串进一步抽象为3类字母,1,元音字母。2,不是“L”的辅音字母。3,“L”。我们可以分别用0,1,2来代表。这样方案数就变成了3^10,于是就可以用搜索枚举了。

#include<bits/stdc++.h>
using namespace std;
string s;
int cnt,a[110],chk[15],vis[15],b[110];
long long ans ;
bool check(){
	int flagl = 0,cnt_p = 1,pos = 0;//cnt_p记连续的辅音或元间数,flagl是否有L,pos记第几个下划线
	memcpy(b,a,(int)s.size()*4);
	if(b[0]==-1)b[0] = chk[pos++];
	if(b[0]==2)flagl = 1;
	for(int i = 1 ; i < (int)s.size(); i ++){
		if(b[i]==-1)b[i] = chk[pos++];
		if((b[i]>0&&b[i-1]>0)||(b[i]==0&&b[i-1]==0))cnt_p++;
		else cnt_p = 1;
		if(b[i]==2)flagl = 1;
		if(cnt_p>=3)return false;
	}
	if(!flagl)return false;
	return true;
}
void dfs(int pos){
	if(pos>=cnt){
		if(check()){
			long long ret = 1;
			for(int i = 0 ; i < cnt ; i ++){
				if(chk[i]==1)ret*=20;
				else if(chk[i]==0)ret*=5;
			}
			ans+= ret;
		}
	}
	else{
		for(int i = 0 ; i < 3; i ++){
			chk[pos] = i;
			dfs(pos+1);
			chk[pos] = -1;
		}
	}
}
int main(){
	cin>>s;
	for(int i = 0 ; i < (int)s.size(); i ++ ){
		if(s[i]=='_')a[i] = -1,cnt++;
		else if(s[i] == 'A'||s[i] == 'E'||s[i] == 'I'||s[i] == 'O'||s[i] == 'U')
			a[i] = 0;
		else if(s[i] == 'L')a[i] = 2;
		else a[i] = 1;
	}
	memset(chk,-1 , sizeof chk);
	dfs(0);
	cout<<ans<<endl;
	return 0;
}

我竟然进省赛了(惊)

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值