牛客2024年七夕节比赛

http://快来参加“牛客2024年七夕节比赛”~ 比赛时间:2024-08-10 19:00:00 - 2024-08-10 21:00:00,比赛时长:2小时,比赛地址:https://ac.nowcoder.com/acm/contest/87410。

   博主也是刚接触c++没多久的新手小白啦!为了帮助和我一样的集美集帅们更好地理解,我将很详细的介绍每个遇到的知识哦,还有可能疑惑的点和拓展点,建议萌新姐妹哥们儿们认真观看。

                                                                  AAAAA

#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
ll num(ll a){
    return a*a+4*a;
}
int main(){
    ll T;
    cin>>T;
    ll i,j;
    for(i=1;i<=T;i++){
        ll n;
        cin>>n;
        ll a[n];
        ll sum=0;
        for(j=0;j<n;j++){
            cin>>a[j];
            sum+=num(a[j]);
        }
        cout<<(sum+10)<<endl;
    }
    return 0;
}

BBBBB

#include<bits/stdc++.h>
using namespace std;
int main() {
     
    cout << "いいよこいよ" << endl;
 
    return 0;
}

这个题可能有人要问了,这题干这么多条件,直接就这样输出了?这题目不就成摆设了?哈哈哈哈看下面的解释哈。

这个题目还可以用PHP,似乎更加快速便捷,看下面提供的几种PHP代码

  是不是没有接触过PHP的小伙伴跟我一样简直目瞪口呆了,好神奇的嘞,哈哈,让我们看看下面的解释。

1.这些代码虽然看起来各不相同,但实际上都在做同样的事情:输出一个字符或者字符串。这些不同的字符或字符串符合题目描述中要求的“符合情景的日文字符串”,因此他们都能够正确通过测试。

2.PHP 代码的语法非常灵活,允许不同的实现方式。只要输出的结果符合题目的要求,即使使用不同的字符或字符串,也能得到正确的答案。题目中没有明确规定输出的具体内容,所以这些不同的输出结果都被判定为正确。

3.PHP 允许通过不同的方式实现输出操作,只要最终输出的内容符合题目要求(即输出一个字符或字符串),无论使用 echo(功能和print一样) 还是 print,无论输出的是日文字符、字符串还是数字,都会被判定为正确。这就是为什么,不同的 PHP 代码都得到了正确的答案。

                                                             CCCCC

#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;

int main(){
    ll n;
    cin >> n;
    ll i;
    cout<<n<<endl;;
    for(i=1;i<=n;i++)
        cout<<i<<' ';
    return 0;
}

   这个题得看清楚,不要真的傻乎乎的就双层循环去判断了,我一开始还想着先给质数分配,然后奇数,偶数不用分配肯定都配对,其实没有那么复杂,让他自己除以自己就行了,这样就能保证配对数最大了。你可能回想着样例一的输出结果也不对啊,题干最后有一句话,排列可能有多种,任选其一输出,所以这个给出的输出样例就是来迷惑没认真读题的小伙伴的,哈哈哈哈哈哈哈哈。

                                                               DDDDD

EEEEE

#include<bits/stdc++.h>
#define MAX 100005
using namespace std;
typedef long long int ll;

ll fa[MAX];  // 并查集数组,用于存储每个节点的父节点
ll man[MAX], woman[MAX];  // 分别存储每个集合中男性和女性的数量

// 初始化并查集,每个节点的父节点初始化为自己
void init(ll n) {
    for (ll i = 1; i <= n; i++) {
        fa[i] = i;///初始时,将其本身作为每个节点的父节点
        man[i] = 0;
        woman[i] = 0;
    }
}

// 查找操作,带路径压缩
ll find(ll i) {
    if (i == fa[i])///如果一个节点的父节点就是其本身
        return i;
    else {
        fa[i] = find(fa[i]);///在面对大数据是比递归高效,缩短路径看下面的解释
        return fa[i];
    }
}

// 合并操作,将两个集合合并
void unionn(ll i, ll j) {
    ll i_fa = find(i);
    ll j_fa = find(j);
    if (i_fa != j_fa) {
        fa[i_fa] = j_fa;///将j作为i的父节点
        man[j_fa] += man[i_fa];  // 合并后更新男性数量,下面解释有对这两行更新数据代码的解释
        woman[j_fa] += woman[i_fa];  // 合并后更新女性数量
    }
}

int main() {
    ll n, m;
    cin >> n >> m;
    vector<ll> gender(n+1);

    init(n);  // 初始化并查集

    // 读取性别信息并初始化 man 和 woman 数组
    for (ll i = 1; i <= n; i++) {
        cin >> gender[i];
        if (gender[i] == 1)  // 1 代表男性
            man[i] = 1;
        else  // 0 代表女性
            woman[i] = 1;
    }

    ll x, y;
    // 读取边并进行合并操作
    for (ll i = 0; i < m; i++) {
        cin >> x >> y;
        unionn(x, y);  // 合并两个节点所在的集合
    }

    // 输出每个节点所在集合中异性别的数量
    for (ll i = 1; i <= n; i++) {
        ll root = find(i);
        if (gender[i] == 1)
            cout << woman[root] << endl;  // 如果是男性,输出女性数量
        else
            cout << man[root] << endl;  // 如果是女性,输出男性数量
    }

    return 0;
}

  这个题目很容易写超时,是一个典型的并查集算法题目,下面来介绍一下路径压缩和普通递归的区别,还有两行男女数量更新代码的解释。

                                                             FFFFF

        这个题目吧主要是猜的,这个让我想到了我今年大一下学期在长沙见习时,见习老师和我们课上互动的一个小游戏,用java写了一个猜数字的小游戏,就是用java中利用Random类,基于一个种子,随机生成一个1-100的整数,他当时是这样教我们猜的:先猜最中间的数字    50,如果系统输出“猜大了”,那就往小数猜,25,如果系统说猜小了,那就往大点的数猜,37也就是((50+25)/2.0=37.5),无论怎么猜就往两个数的间值附近猜。不过关于这题我还是去搜了一下资料是这样解释的:

                                                             GGGGG

#include <bits/stdc++.h>
#define NUM 1000000007 // 修改宏定义,避免浮点数带来的问题
#define N 1000000 // 修改宏定义,确保是整型常量
using namespace std;
typedef long long ll;
ll jc[N + 1]; // 数组大小为 N+1,确保可以存储到 N 的阶乘

// 快速幂函数,用来计算 a 的 b 次方对 NUM 取模的结果
ll qsm(ll a, ll b) {
    ll ans = 1;
    a %= NUM;///避免一开始时a的数据比较大造成大数溢出
    while (b) {
        if (b & 1) {
            ///二进制中,与1作位运算,b的二进制形式末尾是1,相当于b%2==1,即b是奇数
            ans = ans * a % NUM;
            ///每一步都取模,避免大数溢出,有关逐步取模,我在第一篇博客里有详解
        }
        a = a * a % NUM;
        b >>= 1;///二进制中,b向右移一位,相当于b/=2
    }
    return ans;
}

// 初始化阶乘数组
void init_jc() {///init_jc(jc[N]) 是错误的
    jc[0] = 1;// 初始化阶乘数组,jc[0] = 1 表示 0! = 1。
    for (ll i = 1; i <= N; i++) {
        jc[i] = i * jc[i - 1] % NUM;
    }
}

// 计算组合数 C(n, m)
ll C(ll n, ll m) {
    if (m > n) return 0; // 防止无效组合
    //运用费马小定理求逆模元,详解在代码下方
    return jc[n] * qsm(jc[m], NUM - 2) % NUM * qsm(jc[n - m], NUM - 2) % NUM;
}

void solve() {
    int n, m;
    cin >> n >> m;
    if (n < 3) {
        cout << 0 << endl; // 如果 n 小于 3,不能构成有效的桥梁
        return;
    }
    //这步计算详解在代码下方,数学中的排列组合计算
    cout << C(m, n - 1) * (n - 2) % NUM * qsm(2, n - 3) % NUM << endl;
}

signed main() {
    ///signed main(): 主函数,使用 signed 的原因是为了确保整数类型是 long long。
    ///其实这个与int main()差别不大,下方有详解
    ios::sync_with_stdio(0);//这三行(53,54,55)用于加速输入输出操作。
    cin.tie(0);
    cout.tie(0);
    cout << fixed << setprecision(20);//这句话用途下面有详解

    init_jc(); // 初始化阶乘数组
    
    int t = 1; // 修改 t 以适应多组测试,如果只需一组测试,保持 t = 1 即可
    while (t--) {
        solve();
    }
}

首先,为什么要用费马小定理?因为我们要求逆元,为什么要求逆元?因为我们要避免大数的除法

  在学组合数的时候我们知道,组合数是这么定义的,由于分子分母的数据都可能很大,所以我们要转化为方便运算的逆元。

但是逆元怎么计算呢?

cout << C(m, n - 1) * (n - 2) % NUM * qsm(2, n - 3) % NUM << endl;这句代码解释如下:

有关signed main()和int main(),signed main()中可以进行输入操作吗?它与int main()有什么区别吗?

cout << fixed << setprecision(20);这句代码有什么作用呢?

将所有接下来输出的浮点数以固定小数点表示法(而不是科学计数法)显示,并且小数点后保留 20 位数值。这可以用于确保输出的数值精度,尤其是在一些需要高精度显示的场景中(例如科学计算、金融计算)。

                                                                  HHHHH

#include<bits/stdc++.h>
using namespace std;
int main(){
    cout<<"OMG";
    return 0;
}

这题挺无语的,我没有多想,图片中的提示使用了一系列表情符号和相关提示。这些表情符号通常与常见的表达惊讶、兴奋或者不敢置信的情绪相关,我第一反应就是Oh My God!(欢迎大家补充猜想原因)。

                                                                      IIIII

#include <iostream>
#include <string>

using namespace std;
int main() {
    cout <<"password"<< endl;
    return 0;
}

这个题我没想出来,考试结束后查的答案解析

JJJJJ

#include <bits/stdc++.h>
#define int long long
using namespace std;
void solve()
{
    int n, k;
    cin >> n >> k;
    
    int all = (n + 1) * (n + 1) / 6;//数学推导出来的公式,详细见下面的解释
    if (all >= k)
        cout << "yes";
    else 
    {
        cout << "no" << '\n';
        cout << (long long)sqrt(6 * k - 1);
    }
}

signed main()
{
    ios::sync_with_stdio(false);//提高输入输出效率
    cin.tie(nullptr);

    int t = 1;
    // cin >> t;
    while (t--)
        solve();

    return 0;
}

KKKKK

哈哈哈细心的小伙伴通过拉动进度条知道,我们没有被放鸽子,言归正传,让我们来看一下这个代码;

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    ios::sync_with_stdio(0); cin.tie(0);
    int n; cin>>n;
    int fg=1; 
    int times=0;

    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=times;j++) cout<<" ";
        cout<<"鸽";
        cout<<'\n';
        times+=fg;
        if(times==-1)
        {
            fg=1;
            times=1;
        }
        else if(times==27)
        {
            fg=-1;
            times=25;
        }
    }
}

                                                                 LLLLL

#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
int main(){
	ll n;
	cin>>n;
	multiset<ll> a;
	set<ll> sets;
	ll i;
	for(i=0;i<n;i++){
		ll x;
		cin>>x;
		a.insert(x);
		sets.insert(x);///仅仅为了判断数组元素是否都一样
	}
	if(sets.size()==1)
		cout<<"1";
	else{
		//找最长的区间的话,直接排除有1,和有两个及以上偶数存在时的情况
        cout<<1;
	}
	return 0;
}

/*#include <iostream>
using namespace std;
int main () {
    cout << "1";
    return 0;
}*/

这个题我感觉挺无语的,我本来在想,为什么这个题这么简单,一个最长的连续区间,使得区间内数字两两之间不存在共同因子,他也没说第二行输入的a[i]是像1 2 3 4 5 6 7 8 这样的连续序列吧,万一输入的是,4 5 7 9 11 这样的呢,我很不理解为什么答案直接输出1。我查了一下才知道,1是所有数的公共因子,所以最长连续序列只能是1

好啦好啦!终于完成编辑了,谢谢观看,不足之处和缺点欢迎友友们指出,谢谢!(花花)(😊)

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值