目录
A.谜题:质数
输入描述
输出描述
输入
输出
解析
B.Kevin逛超市 2 (简单版本)
输入描述
输出描述
输入
输出
思路
C.被遗忘的书籍
题目描述
输入描述
输出描述
输入
输出
输入
输出
思路
比赛链接
牛客小白月赛82_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com)
A.谜题:质数
题目描述
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
给出一个质数 n,请求出一个质数 m,使得 n+m 不是质数。
其中,质数是指大于 1 的自然数,除了 1 和自身外,不能被其他自然数整除的数。
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
输入描述
仅输入一行,包含一个整数 n(2≤n≤2⋅105)n(2\leq n\leq 2\cdot 10^5)n(2≤n≤2⋅105),保证 nnn 是质数。
输出描述
仅输出一行。包含一个质数 m(2≤m≤2⋅1e5),表示答案。 如果有多个可行的答案,请输出任意一个。 可以证明,在题目所给条件下一定有解。
示例1
输入
复制
11
输出
复制
3
解析
此题解法有很多,由于m很小,这里采用了纯暴力思想, 用线性筛法筛出所有的质数,然后枚举满足条件的m即可。
#include <iostream>
#include <algorithm>
using namespace std;
const int N= 2e5+10;
int primes[N], cnt;
bool st[N];
void get_primes(int n)
{
for (int i = 2; i <= n; i ++ )
{
if (!st[i]) primes[cnt ++ ] = i;
for (int j = 0; primes[j] <= n / i; j ++ )
{
st[primes[j] * i] = true;
if (i % primes[j] == 0) break;
}
}
}
int main()
{
int n;
cin >> n;
get_primes(N-1);
for(int i=2;i<=2e5;i++)
if(st[i+n]) {
cout<<i;
break;
}
return 0;
}
B.Kevin逛超市 2 (简单版本)
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
两个版本唯一的不同是:简单版本中折扣券和立减券的数量均为 111,困难版本中折扣券和立减券的数量为给定值。
氧气少年在逛超市。
他总共买了 n 件商品,第 i 种商品的价格为 pi。
超市有下面的打折政策:
- 每名顾客有 1 张折扣券,可以让一件商品的价格打折(如果此商品原价为 pi,那么使用此优惠券后,价格变为 pi×x%)。
- 每名顾客有 1 张立减券,可以让一件商品的价格减小 y(如果此商品原价小于 y,那么可以花费 0 买下)。
- 每个商品最多使用 1 张优惠券。
请求出氧气少年可能付出的最小的花费。
输入描述
第一行包含一个整数 T(1≤T≤1e5),表示测试用例的组数。 对于每组测试用例: 第一行包含三个整数 n(1≤n≤2⋅1e5),x(1≤x≤99),y(1≤y≤1e4)。 第二行包含 n 个整数 p1…pn (1≤pi≤1e4),表示商品的价格。 保证对于所有的测试用例,n 的总和不超过 2⋅1e5。
输出描述
对于每组测试用例: 仅输出一行,包含一个实数,表示答案。如果你的答案和标准答案的绝对误差或相对误差不超过 1e−4,则你的答案会被视为正确。
示例1
输入
复制
2 3 50 50 100 100 50 3 50 200 95 100 50
输出
复制
150.000000000000 97.500000000000
思路
贪心思想,让最大的两个采用上述两种方式,至于具体用哪个,无非两种方式,最大的用第一个方案,第二大的用第二个方案,反之又是一种,可以都枚举,然后取最小值,注意特判只有一个的时候。
#include<bits/stdc++.h>
#define int long long
#define d lld
using namespace std;
const int N=2e5+10;
int t,n;
double x,y;
double p[N];
bool st[N];
void solve() {
cin>>n>>x>>y;
for(int i=1;i<=n;i++) {
cin>>p[i];
}
sort(p+1,p+n+1);
if(n==1) {
double ans=0;
double y1=p[1]*x/100;
double y2=max(0.0,p[1]-y);
ans=min(y1,y2);
printf("%.10lf\n",ans);
}
else {
double ans=0;
for(int i=1;i<=n-2;i++) ans+=p[i];
double y1=p[n]*x/100;
double y2=max(0.0,p[n-1]-y);
ans=ans+y1+y2;
double ans1=0;
for(int i=1;i<=n-2;i++) ans1+=p[i];
y1=p[n-1]*x/100;
y2=max(0.0,p[n]-y);
ans1=ans1+y1+y2;
printf("%.10lf\n",min(ans,ans1));
}
}
signed main() {
cin>>t;
while(t--) solve();
return 0;
}
C.被遗忘的书籍
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
这里有一本包含 nnn 个小写英文字母的书籍,可惜的是书上的字体很模糊,并不知道具体的字符。但我们已经知道的是,这本书包含子串 "txt"。
其中,子串是指字符串中连续的一段字符序列。
请求出这本书籍的内容的可能的种类数量。答案对 998244353取模。
输入描述
第一行包含一个整数 T(1≤T≤2⋅1e5),表示测试用例的组数。 对于每组测试用例: 仅输入一行,包含一个整数 n(1≤n≤2⋅1e5)。
输出描述
对于每组测试用例: 仅输出一行,包含一个整数,表示答案。
示例1
输入
复制
3 2 3 4
输出
复制
0 1 52
示例2
输入
复制
3 199998 199999 200000
输出
复制
866730100 551952279 943410719
思路
这题给人的第一感觉是组合计数,但是用状态压缩的思想更加方便。
引入四种状态
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10,mod=998244353;
int t,n;
int dp[N][5];
signed main() {
dp[0][0]=1;
for(int i=1;i<N;i++) {
dp[i][0]=(dp[i][0]+dp[i-1][0]*25+dp[i-1][1]*24+dp[i-1][2]*25)%mod;
dp[i][1]=(dp[i][1]+dp[i-1][0]+dp[i-1][1])%mod;
dp[i][2]=(dp[i][2]+dp[i-1][1])%mod;
dp[i][3]=(dp[i][3]+dp[i-1][2]+dp[i-1][3]*26)%mod;
}
cin>>t;
while(t--) {
cin>>n;
cout<<dp[n][3]<<"\n";
}
return 0;
}