首页 > 其他分享 >西农2022级ACM招新考题

西农2022级ACM招新考题

时间:2023-08-20 16:56:14浏览次数:48  
标签:西农 return idx int ll ACM 招新 maxn ans

准备放弃一段时间算法。

西农2022级ACM招新上周结束了,五一假期研究了一下题解,整理发在博客。

1. 这真的是签到题

print("\"ACM welcomes you\\n\"")

2. 4和数

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e6 + 10;
int f[maxn + 1];
int l, r;

bool check(int num)
{
    int sum = 0;
    while (num)
    {
        sum += num % 10;
        num /= 10;
    }
    if (sum % 4 == 0)
        return true;
    else
        return false;
}

int main()
{
    scanf("%d%d", &l, &r);
    for (int i = 4; i <= maxn; i += 4)
    {
        // 4和数必是4的倍数,缩小范围
        if (check(i))
        {
            // 如果是4和数,标记为1
            f[i] = 1;
        }
    }
    for (int i = 4; i <= maxn; i++)
    {
        // 求前缀和
        f[i] += f[i - 1];
    }
    printf("%d\n", f[r] - f[l - 1]);
    return 0;
}

3. 小D买文具

#include <bits/stdc++.h>
#define maxn 50000

using namespace std;

int n, a, b, c, ans[3];
int m = -1;

int min(int a, int b, int c)
{
    int t;
    if (b > a)
    {
        t = a;
        a = b;
        b = t;
    }
    if (c > b)
    {
        t = b;
        b = c;
        c = t;
    }
    if (b > a)
    {
        t = a;
        a = b;
        b = t;
    }
    return c;
}

int main()
{
    scanf("%d", &n);
    for (int i = 0; i * 5 <= n; i++)
    {
        for (int j = 0; j * 3 <= n - i * 5; j++)
        {
            // 枚举圆规和签字笔,剩余的钱全买稿纸
            if ((n - i * 5 - j * 3) % 2 == 0)
            {
                int k = (n - i * 5 - j * 3) / 2;
                // 如果钱刚好花完
                if (m < min(i, j, k))
                {
                    // 成套的数量尽可能大
                    a = i;
                    b = j;
                    c = k;
                    m = min(i, j, k);
                }
                else if (m == min(i, j, k))
                {
                    if (i + j + k > a + b + c)
                    {
                        // 在满足以上条件情况下,物品的总数尽可能大,即a+b+c尽可能大。
                        a = i;
                        b = j;
                        c = k;
                    }
                }
            }
        }
    }
    printf("%d %d %d", a, b, c);
    return 0;
}

4. 大阳分大洋

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int maxn = 1e6;
int n, x, ans;
int f[maxn]; // 前缀和数组

int get(int l, int r)
{
    // 获取l到r之间有多少大洋
    return f[r] - f[l - 1];
}

signed main()
{
    scanf("%lld", &n);
    for (int i = 1; i <= n; i++)
    {
        scanf("%lld", &x);
        f[i] = f[i - 1] + x; // 求前缀和
    }
    for (int i = 1; i < n; i++)
    {
        // i<n,如果i=n,i+1就大于n了
        if (get(1, i) == get(i + 1, n))
        {
            ans++;
        }
    }
    printf("%d\n", ans);
}

5. 汉诺塔

#include <bits/stdc++.h>
#define mod 1000000007

using namespace std;

typedef long long ll;

int quickpow(ll a, ll b, ll p = mod)
{
    int ans = 1;
    while (b)
    {
        if (b & 1)
            ans = ans * a % p;
        a = a * a % p;
        b >>= 1;
    }
    return ans;
}

int main()
{
    int n;
    scanf("%d", &n);
    ll ans = quickpow(2, n) - 1;
    printf("%d\n", ans);
    return 0;
}

6. 突击考试

#include <bits/stdc++.h>

using namespace std;
const int maxn = 1e5;
int N, K, L = -1;
int A[maxn + 1], B[maxn + 1];

int main()
{
    cin >> N;
    for (int i = 1; i <= N; i++)
    {
        cin >> A[i] >> B[i];
    }

    for (int i = 1; i <= 5; i++)
    {
        int sum = 0;
        for (int j = 1; j <= N; j++)
        {
            if (i == A[j] || i == B[j])
            {
                sum++;
            }
            else
            {
                if (L < sum)
                {
                    L = sum;
                    K = i;
                }
                sum = 0;
            }
            if (L < sum)
            {
                L = sum;
                K = i;
            }
        }
    }
    cout << L << " " << K << endl;
    return 0;
}

7. 小华的立方数

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

ll getAns(ll k)
{
    ll l = -1;
    ll r = 1e6 + 1;
    while (l < r)
    {
        ll mid = (l + r + 1) / 2;
        if (mid * mid * mid <= k)
        {
            l = mid;
        }
        else if (mid * mid * mid > k)
        {
            r = mid - 1;
        }
    }
    return l;
}

int main()
{
    ll n;
    cin >> n;
    while (n--)
    {
        ll L, R;
        scanf("%lld%lld", &L, &R);
        ll a = getAns(L - 1);
        ll b = getAns(R);
        ll ans = b - a;
        printf("%lld\n", ans);
    }
    return 0;
}

8. 小华的幸福

!> 这道题我只能过70%

#include <bits/stdc++.h>
#define mod 1000000007
#define int long long

typedef long long ll;
using namespace std;

const int maxn = 1e6;
int n, k;
int a[maxn];

int quickpow(int a, int b)
{
    int ans = 1;
    while (b)
    {
        if (b & 1)
        {
            ans = a * ans % mod;
        }
        a = a * a % mod;
        b >>= 1;
    }
    return ans;
}

signed main()
{
    scanf("%lld%lld", &n, &k);
    int fm = ((n - 1) * n) / 2;
    int fz = 0;
    for (int i = 1; i <= n; i++)
    {
        scanf("%lld", &a[i]);
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = i + 1; j <= n; j++)
        {
            if (a[i] + a[j] == k)
            {
                fz++;
            }
        }
    }
    int ans = quickpow(fm, mod - 2) * fz % mod;
    printf("%lld\n", ans);
    return 0;
}

9. 元素周期表

!> 抄的题解,我读不懂题

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e3 + 10;
char s[1010][10] =
    {"1s", "2s", "2p", "3s", "3p", "4s", "3d", "4p", "5s", "4d", "5p", "6s", "4f", "5d", "6p", "7s", "5f", "6d", "7p"};
// s数组优先处理出排列顺序
struct Node
{
    char s[10];
    int cnt;
} a[N];
// 结构体存放每层元素和所具有的原子个数
char st[5] = {'s', 'p', 'd', 'f'}; // 用于对spdf的排序处理
bool cmp(Node x, Node y)
{
    if (x.s[0] != y.s[0])
        return x.s[0] < y.s[0];
    return x.s[1] < y.s[1];
} // 排序规则函数
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        int n, idx = 0;
        cin >> n;
        for (int i = 0; i < 19; i++)
        {
            a[i].s[0] = s[i][0];
            a[i].s[1] = s[i][1];
            a[i].cnt = 0;
        } // 因为有多组测试用例,初始化结构体
        while (n)
        { // 模拟电子排列顺序
            if (a[idx].s[1] == 's')
            {
                if (n >= 2)
                {
                    a[idx].cnt = 2;
                    n -= 2;
                }
                else
                {
                    a[idx].cnt = n;
                    n = 0;
                }
            }
            else if (a[idx].s[1] == 'p')
            {
                if (n >= 6)
                {
                    a[idx].cnt = 6;
                    n -= 6;
                }
                else
                {
                    a[idx].cnt = n;
                    n = 0;
                }
            }
            else if (a[idx].s[1] == 'd')
            {
                if (n >= 10)
                {
                    a[idx].cnt = 10;
                    n -= 10;
                }
                else
                {
                    a[idx].cnt = n;
                    n = 0;
                }
            }
            else if (a[idx].s[1] == 'f')
            {
                if (n >= 14)
                {
                    a[idx].cnt += 14;
                    n -= 14;
                }
                else
                {
                    a[idx].cnt = n;
                    n = 0;
                }
            }
            idx++; // 逐层填充电子,充当指针作用
        }
        sort(a, a + idx, cmp); // 排序
        for (int i = 0; i < idx; i++)
        {
            if (a[i].cnt == 0)
                continue;
            if (i != 0)
                cout << " ";
            cout << a[i].s[0] << a[i].s[1] << a[i].cnt;
            // 处理输出和格式问题
        }
        cout << endl;
    }
    return 0;
}

10. 剑刃风暴

#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e6 + 5;
struct node
{
    int h; // 血量
    int k; // 亡语数量
} a[maxn];
bool cmp(node x, node y) // 以血量从小到大排序
{
    return x.h < y.h;
}

int idx;

int main()
{
    int n, x;
    cin >> n >> x;
    for (int i = 1; i <= n; i++)
    {
        int A, k;
        cin >> A >> k;
        a[++idx] = {A, k};
        for (int j = 1; j <= k; j++)
        {
            // 因为亡语随从需要等A死后才会收到伤害
            // 所以将亡语所从的血量设置为A+B
            int B;
            cin >> B;
            a[++idx] = {A + B, 0};
        }
    }
    // 按血量排序
    sort(a + 1, a + 1 + idx, cmp);
    // 答案初始化为n
    int ans = n;
    // 开始遍历扣血
    for (int i = 1; i <= idx; i++)
    {
        if (a[i].h != a[i - 1].h) // 如果i和i-1的血量不同,则更新答案
        {
            // 如果剑刃风暴用完了,则不更新答案
            if (x == 0)
                break;
            x--;
        }
        // 每次更新答案 + 亡语随从 - 1(死亡随从)
        ans = ans + a[i].k - 1;
    }
    // 输出答案
    cout << ans;
}

标签:西农,return,idx,int,ll,ACM,招新,maxn,ans
From: https://www.cnblogs.com/orzmiku/p/17644244.html

相关文章

  • 西农OJ P1073 阶乘TvT
    1073:阶乘题目描述给一个整数,请输出该数字阶乘的后缀0的个数,例如:数字7,它的阶乘为5040,后面有一个0,则输出1;还有数字10,它的阶乘为3628800,后面有两个0,则输出2。输入第一行一个数据N,小于100,表示一共要输入n个数字,以后n行输入一个数字。输出对应于每一个输入,输出一个满足题目要......
  • 西农OJ P1067 Humble Number
    1067:HumbleNumber题目描述如果一个数只有素数因子2,3,5,7,那么这个数被称为“HumbleNumber”。前20个“HumbleNumber”是:1,2,3,4,5,6,7,8,9,10,12,14,15,16,18,20,21,24,25,27。经验证,2000000000以内的“HumbleNumber”共有5842个。你的任务是编写一个程序,根据要求输出序列中的某一个数。如22,......
  • 西农OJ P1005 装载问题
    装载问题问题描述有两艘船,载重量分别是c1、c2,n个集装箱,重量是wi(i=1…n),且所有集装箱的总重量不超过c1+c2。确定是否有可能将所有集装箱全部装入两艘船。输入多个测例,每个测例的输入占两行。第一行一次是c1、c2和n(n<=10);第二行n个整数表示wi(i=1…n)。n等于0标志输入结束。......
  • 西农OJ P1491 城市电话号码
    题目描述某城市电话号码包括地区码、前缀、有效号码三部分组成,其中地区码是0-4位数字;前缀是以非0开头的3位数字,有效号码是4位数字,各部分之间用减号(-)分隔,地区码为空时地区码与前缀之间不包含分隔符。请编写函数检测输入号码num的有效性,若输入号码符合上述规定返回0,否则返回1。函......
  • ACM模式输入输出处理
    cin遇到\n会停止读取但是不会读出来1.数组长度确定,多组数据直接一个while循环输入151020输出630while(cin>>a>>b){cout<<a+b<<endl;}第一个数表示组数的,直接给个size,然后for循环输入2151020输出6302.数组长度不确定','分......
  • ACM常见格式提取代码
    1.提取指定范围符号内用逗号隔开数字vector<int>trans(string&str){size_tstart=str.find('[');size_tend=str.find(']');stringnumStr=str.substr(start+1,end-start-1);stringstreamss(numStr);intnumber;......
  • ACM之2000——2050题目答案及解析
    /*****************************2000题**********************************/#include<iostream>#include<algorithm>使用C++中的库函数,实现字符位置调整usingnamespacestd;intmain(void){charn[4];while(cin>>n){if(n[0]>n[1]......
  • 游记(?)—ACM班与John班申请失败经历+经验
    本来这种东西应该发在某社区上的。但是考虑种种原因还是算了吧1.有活人存在的某社区对社恐不友好2.某些发言在高年级学长看来可能非常智障3.避免增加黑历史话说学校似乎没有要求我们对这些东西保密?题外话,感觉下文透露的个人信息完全足够被盒了简要介绍我的情况:某弱省考生,工......
  • UESTC 2023 Summer Training #23 for div2/2022-2023 ACM-ICPC Latin American Region
    Preface今天这场签到巨多,和昨天那场形成了鲜明的对比但可惜后盘的时候我划了太久的水,最后接了B题然后没调出来成为战俘最气的是赛后发现原来是没注意输出格式,本来可以说一遍过的题结果没写过,属实可惜,就当长教训了以后一定要尤其注意输入输出格式A.AskingforMoneyORZ徐......
  • 【ACM专项练习#03】打印图形、栈的合法性、链表操作、dp实例
    运营商活动题目描述小明每天的话费是1元,运营商做活动,手机每充值K元就可以获赠1元,一开始小明充值M元,问最多可以用多少天?注意赠送的话费也可以参与到奖励规则中输入输入包括多个测试实例。每个测试实例包括2个整数M,K(2<=k<=M<=1000)。M=0,K=0代表输入结束。输出对于每个测试实......