2024.3.7|华北水利水电大学江淮校区ACM社团训练赛

2024.3.7|华北水利水电大学江淮校区ACM社团训练赛

1.[NOIP2015]金币
2.牛牛算数
3.四则运算
4.数学实验
5.隐瞒成绩
6.斐波那契

心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。
2024.3.7|华北水利水电大学江淮校区ACM社团训练赛_第1张图片

[NOIP2015]金币

题目
国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币。
请计算在前K天里,骑士一共获得了多少金币。

输入描述:
输入只有1行,包含一个正整数K,表示发放金币的天数。
输出描述:
输出只有1行,包含一个正整数,即骑士收到的金币数。
示例1
输入
6
输出
14
说明:
骑士第一天收到一枚金币;第二天和第三天,每天收到两枚金币;第四、五、六天,每天收到三枚金币。因此一共收到1+2+2+3+3+3=14枚金币。

注意
此题枚举即可。

实践代码:

void solve(){
    int k;cin>>k;
    int sum=0,x=1,y=0;//x记录每天收到的金币,y记录收到同样金币的天数
    for(int i=1;i<=k;i++){
        sum+=x;
        y++;
        if(x==y) {y=0;x++;}
    }
    cout<<sum;
}

牛牛算数

题目
给你一个含有n个元素的数组arr[i],问这个数组的中位数大还是平均数大,如果中位数更大输出1,如果平均数更大输出-1,如果中位数和平均数相等输出0

示例1
输入
[1,3,4]
返回值
1
说明:
中位数3,平均数约等于2.67,所以输出1
示例2
输入
[7,4,8,11]
输出
0
说明:
中位数7.5,平均数7.5,所以输出0
示例3
输入
[6,6,6,6,5,8]
输出
-1
说明:
中位数6,平均数约等于6.17,所以输出-1
备注:
对于30%的数据: 1≤n≤1e3,1≤arr[i]≤1e9
对于100%的数据: 1≤n≤1e6,1≤arr[i]≤1e9

注意
题目中让我们比较平均数ave和中位数mid,我们知道ave=sum/arr.size(),但是除法的误差是较大的,为了避免误差,我们可以转化而求sum和mid*arr.size()。

实践代码:

class Solution {
public:
    /**
     * 
     * @param arr int整型vector 
     * @return int整型
     */
    int Answerofjudge(vector<int>& arr) {
        // write code here
         int sum = 0,mid;
        for(int i=0;i<arr.size();i++){
            sum += arr[i];
        }
        sort(arr.begin(),arr.end());
        if(arr.size()&1) mid = arr[arr.size()/2]*arr.size();//奇数情况
        else mid = arr[arr.size()/2-1]*arr.size()/2+arr[arr.size()/2]*arr.size()/2;//偶数情况
        if(x>mid) return -1;
        else if(x<mid)return 1;
        return 0;
    }
};
}

扩展:

四则运算

题目
二年级的qcmm刚刚学习了四则运算,但是qcmm学的并不是那么扎实,每次都会忘了先乘除后加减的运算顺序。但是爱学习的qcmm每次学习新知识都会顺便写在日记里,下面日记内容

2006年6月1日 星期四 晴
虽然今天是儿童节但还是需要去上幼儿园老师们今天格外亲切给班里每位小朋友买根棒棒糖今天学习到四则运算看起来好简单但是每次都算不对

注意:其中四声“/”为整除,例如:7/3=2

输入描述:
第一行,一个整数n(2<=n<=10)。
第二行,n个正整数: 第i个正整数表示 ai(1<=ai<=100) ,表示数字。
第三行,n-1个正整数: 第j个正整数表示 bj(1<=bj<=63) ,表示运算符。
输出描述:
一个整数表示答案,题目保证运算过程中不会超过long long的范围。
示例1
输入
3
12 6 3
5 2
输出
-1
说明:
日记中第5个字“是”的拼音的“shì”四声,故第一个运算符是“/”,第2个字“然”的拼音是“rán”二声,故第二个运算符是“-”,所以本样例所表达的式子是12/6-3
示例2
输入
2
2 6
19
输出
12
示例3
输入
6
10 6 2 8 9 3
2 5 6 41 23
输出
6
备注:
通常题目是一个有用的线索,但是样例的反推或许更能说明什么
依稀记得拼音和四则运算都是童年的阴影

注意
本题暴力即可。

实践代码:

int op(int a,int b,int t){
    int ans;
    if(t==1) ans=a+b;
    if(t==2) ans=a-b;
    if(t==3) ans=a*b;
    if(t==4) ans=a/b;
    return ans;
}

void solve(){
    string s = "0121142224241444422312112414313343233144211224424443233144341444";
    int n;cin>>n;
    vector<int> a(n);
    for(int i=0;i<n;i++) cin>>a[i];
    vector<int> b(n);
    for(int i=1;i<n;i++) cin>>b[i];
    int res=a[0];
    for(int i=1;i<n;i++){
        res=op(res,a[i],s[b[i]]-'0');
    }
    cout<<res<<endl;
    return;
}

数学实验

题目
给出一个数字n,需要不断地将所有数位上的值做乘法运算,直至最后数字不发生变化为止。
问最后生成的数字为多少?
输入描述:
输入文件只有一行, 一个字符串s。
输出描述:
输出文件只有一行,包含一个整数,即作文标题的字符数(不含空格和换行符)。
示例1
输入
10
输出
0
示例2
输入
55
输出
0
说明
55 -> 5 * 5 = 25 -> 2 * 5 = 10 -> 1 * 0 = 0
备注:
1≤n≤1018

注意
简单的逐位相乘和枚举。

实践代码:

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param n long长整型 老师给牛牛的数字
     * @return int整型
     */
    int mathexp(long long n) {
        // write code here
        while(n>=10){
            int x=1;//x记录各位乘积
            while(n){
                x*=(n%10);
                n/=10;
            }
            n=x;
        }
        return n;
    }
};

隐瞒成绩

题目
小希告诉了你她的考试成绩:“我这次的成绩乘以a,再加上b,再除以c,向下取整,最后减去d的答案是p。”

你有点懵了,所以打算写个程序把答案算出来。

你知道小希这次考试的成绩是整数,范围在0到100之间。如果有多个分数满足小希描述的要求,小希的分数将会是最高的那个。
输入描述:
输入五个正整数a,b,c,d,p,内容为题面所提及的。
输出描述:
输出一个非负整数ans,表示小希的成绩。
示例1
输入
2 3 4 5 45
输出
100
说明
100*2=200, 200+3=203,203/4 = 50,50-5=45
备注:

对于20%的数据,小希的成绩大于等于99分。
对于40%的数据,小希的成绩大于等于95分。
对于%20%的数据,c=1。
对于100%的数据,小希的成绩在0到100之间,a,b,c,d≤100, p≤100000。

注意
题目中说如果多个分数满足,取最大分的那个,那么就可以从100-0开始枚举。

实践代码:

void solve(){
    int a,b,c,d,p;cin>>a>>b>>c>>d>>p;
    for(int i=100;i>=0;i--){
        if((i*a+b)/c-d==p) {cout<<i;return;}
    }
}

斐波那契

题目
设f[i]表示斐波那契数论的第i项
f[1]=1,f[2] =1,f[i] = f[i - 1] + f[i - 2]
给定一个n求f[n−1]∗f[n+1]−f[n]2

输入描述:
一个整数n
输出描述:
一个整数,表示答案
示例1
输入
4
输出
1

对于30%的数据,n⩽5 对于50%的数据,n⩽10^5^ 对于80%的数据,n⩽10^15^ 对于100%的数据,2⩽n⩽10^1000000^ **注意**: ==这道题考递推但更考思维和数学推理。==

实践代码:

/*
f(n-1)*f(n+1)-f(n)*f(n)//n为偶数/奇数
=f(n-1)*[f(n)+f(n-1)]-[f(n-1)+f(n-2)]*f(n)
=f(n-1)f(n)+f(n-1)*f(n-1)-f(n-1)f(n)+f(n-2)*f(n)
=f(n-1)*f(n-1)+f(n-2)*f(n)
=-(f(n-2)*f(n)-f(n-1)*f(n-1));//递推结果为负的奇数/偶数
而已知当n为1时,结果为-1(奇数),n为2时,结果为1(偶数)
所以当n为奇数时,最终递推出的结果是-1,n为偶数时,推出的结果是1
*/
void solve(){
   string s;cin>>s;
    if((s[s.size()-1]-'0')%2==0) cout<<1;
    else cout<<-1;
    
}

心有猛虎,细嗅蔷薇。再见了朋友~

你可能感兴趣的:(训练赛,c++,笔记,算法)