2025年河南工业大学2025新生周赛(6)

A:这是一道签到题吗?

 

用双层循环模拟即可,注意特殊输出的判断。

 #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int P = 1e9+7;
const int N = 1e2+10;

int a[N][N];

int main() 
{
    int n,m;
    cin>>n>>m;
    int num = 0;
    for(int i = 1;i<=n;i++)
    {
        for(int j = 1;j<=m-1;j++)
        {
            num++;
            cout<<num<<' ';
        }
        num++;
        if(i%2==1) cout<<"HAUT"<<endl;
        else cout<<num<<endl;
    }
    

    return 0;
}
    

 

B:这是一道签到题

 

对于每一种牌,用数字映射到二维数组中,用来记录是否已经借过这张牌,若之前没有借过,则记录,并将牌总数减一。最后输出剩余牌的数量即可。

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N = 1e3 + 10;

int n;
int cnt[N][N];

int main()
{
    cin >> n;
    int ans = 52;

    for (int i = 1; i <= n; i++)
    {
        string op;
        cin >> op;

        //cout << op << endl;
        int f = -1, s = -1;

        if (op[1] == 'A') {
            f = 1;
        } else if (op[1] == '2') {
            f = 2;
        } else if (op[1] == '3') {
            f = 3;
        } else if (op[1] == '4') {
            f = 4;
        } else if (op[1] == '5') {
            f = 5;
        } else if (op[1] == '6') {
            f = 6;
        } else if (op[1] == '7') {
            f = 7;
        } else if (op[1] == '8') {
            f = 8;
        } else if (op[1] == '9') {
            f = 9;
        } else if (op[1] == 'T') {
            f = 10;
        } else if (op[1] == 'J') {
            f = 11;
        } else if (op[1] == 'Q') {
            f = 12;
        } else if (op[1] == 'K') {
            f = 13;
        }

        if (op[0] == 'D') {
            s = 1;
        } else if (op[0] == 'C') {
            s = 2;
        } else if (op[0] == 'H') {
            s = 3;
        } else if (op[0] == 'S') {
            s = 4;
        } 


        if (cnt[f][s] == 0) ans--;
        cnt[f][s]++;
    }

    cout << ans << endl;

    return 0;
}

 

 

C:这真是一道签到题吗?

题目要求变为回文数组,那么对于数组两边对称的数来说,左边的数加一相当于右边的数减一,左边的数减一相当于右边的数加一。因此可以先对数组两边初始化,都减去较小的数,使得数组的元素全部变为非负整数。最后用贪心的方法计算答案。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 2e5+10;
int n;
int a[N];
int main()
{
    cin>>n;
    for(int i = 1;i<=n;i++) cin>>a[i];
    for(int i = 1,j = n;i<=j;i++,j--)
    {
        int t = min(a[i],a[j]);
        a[i]-=t;
        if(i!=j) a[j]-=t;
    }

    ll res = 0;
    for(int i = 1;i<=n;i++)
    {
        int t = a[i];
        res+=t;
        a[i+1] -= min(t,a[i+1]);
    }
    cout<<res;

    
    return 0;
}

 

 

D:Hello,World!

逐个检查字符即可。

#include <stdio.h>
#include <string.h>

int main() {
    char input[1005];
    const char *str = "Hello,World!";
    int m= 0;
    int t= strlen(str);

    scanf("%s", input);

    for (int i = 0; input[i] != '\0'; i++)
 {
        if (m< t&& input[i] == str[m]) {
            m++;
        }
    }

    printf("%s\n", (m== t) ? "Yes" : "No");

    return 0;
}

 

 

E:数组求和

遍历求和即可。

#include <stdio.h>
#include <string.h>

int main() 
{
    char s[2];
    double t, ans = 0.0;
    
    scanf("%s", s);
    
    for (int i = 0; i < 12; i++) {
        for (int j = 0; j < 12; j++) {
            scanf("%lf", &t);
            if (i > j) {
                ans += t;
            }
        }
    }
    
    if (strcmp(s, "S") == 0) {
        printf("%.1f\n", ans);
    } else {
        printf("%.1f\n", ans / 66);
    }
    
    return 0;
}

 

 

F:加and乘

根据题目模拟即可。

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int N, P;
    cin >> N >> P;
    vector<long long> a(N + 1);
    for (int i = 1; i <= N; ++i) {
        cin >> a[i];
        a[i] %= P;
    }

    int M;
    cin >> M;
    while (M--) {
        int op;
        cin >> op;
        if (op == 1) {
            int t, g, c;
            cin >> t >> g >> c;
            c %= P; 
            for (int i = t; i <= g; ++i) {
                a[i] = (a[i] * c) % P;
            }
        } else if (op == 2) {
            int t, g, c;
            cin >> t >> g >> c;
            c %= P;
            for (int i = t; i <= g; ++i) {
                a[i] = (a[i] + c) % P;
                if (a[i] < 0) a[i] += P;
            }
        } else if (op == 3) {
            int t, g;
            cin >> t >> g;
            long long sum = 0;
            for (int i = t; i <= g; ++i) {
                sum = (sum + a[i]) % P;
            }
            cout << sum % P << endl;
        }
    }

    return 0;
}

 

 

 

G:多项式相加(多实例)

输入多项式求和,高次到 0 次规范输出结果。

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int t,i,j,x,y;
 
    scanf("%d",&t);
 
    for(i=1;i<=t;i++)
    {
        int a[110]={0};
        int b[110]={0};
        int c[110]={0};
        while (scanf("%d %d",&x,&y),x!=-1)
        {
 
 
            a[x] += y;
        }
 
        while (scanf("%d %d",&x,&y),x!=-1)
        {
 
            b[x] += y;
 
        }
        for (j=0;j<=100;j++)
        {
            c[j]=b[j]+a[j];
        }
        int z = 0;
        for (j=100;j>1;j--)
        {
            if (z==0 && c[j]!=0)
            {
                if(c[j]==1)
                {
                    printf("x%d",j);
                }
                else if(c[j]==-1)
                {
                    printf("-x%d",j);
                }
                else{
                    printf("%dx%d",c[j],j);
                }
                z++;
            }
            else if(c[j]!=0)
            {
                if(c[j]==1)
                {
                    printf("+x%d",j);
                }
                else if(c[j]==-1)
                {
                    printf("-x%d",j);
                }
                else
                {
                    printf("%+dx%d",c[j],j);
                }
            }
        }
        if(c[1]!=0)
        {
            if(c[1]==1)
            {
                if(z == 0) printf("x");
                else printf("+x");
            }
            else if(c[1]==-1)
            {
                printf("-x");
            }
            else
            {
                if(z == 0) printf("%dx",c[1]);
                else printf("%+dx",c[1]);
            }
            z++;
        }
        if (c[0]!=0)
        {
            if(z == 0) printf("%d",c[0]);
            else printf("%+d",c[0]);
            z++;
        }
        if(z == 0)
        {
            printf("0");
        }
        printf("\n");
    }
 
    return 0;
}

 

 

H:数组切割

根据题目可以分析出,出现次数为奇数的不同元素一定有偶数个。根据元素的特点分类讨论:对于出现次数为偶数且/2为奇数的,直接分开放到两个序列中,之后不再考虑;对于出现次数为偶数且/2为偶数的,交替放到两个序列中,并且放入两个序列的个数之差为2,以保证答案最大化;对于出现次数为奇数的,分为一奇一偶放入两个序列。

注意特例的判断。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int P = 1e9+7;
const int N = 4e5+10;

int a[N];

void solve()
{
    int n ;
    cin>>n;
    unordered_map<int,int> mp;
    vector<int> v1;//偶数且/2为偶数
    vector<int> v2;//偶数且/2为奇数
    vector<int> v3;//奇数  一定有偶数个
    for(int i = 1;i<=2*n;i++) 
    {
        cin>>a[i];
        mp[a[i]]++;//存储元素出现的次数
    }

    int cnt1 = 0,cnt2 = 0;//cnt1,cnt2分别表示序列p,q的元素数量
    int ans = 0;

    for(auto t:mp)
    {
        int w = t.first,v = t.second;
        if(v%2==0&&(v/2)%2==0) v1.push_back(w);
        if(v%2==0&&(v/2)%2==1) v2.push_back(w);
        if(v%2==1) v3.push_back(w);
    }

   ans += v2.size()*2;

   if(v3.size()!=0)
   {
        for(int i = 0;i<v1.size();i++)
        {
            int t = mp[v1[i]];
            if(cnt1>cnt2) cnt1 += (t/2)-1,cnt2+=(t/2)+1;
            else cnt1 += (t/2)+1,cnt2+=(t/2)-1;
            ans +=2;
        }
        ans += v3.size();
   }
   else
   {
        if(v1.size()%2==1) ans += (v1.size()-1)*2;
        else ans += v1.size()*2;
   }
   cout<<ans<<endl;
    


}

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

    return 0;
}

 

posted @ 2025-12-02 22:00  河南工业大学算法协会  阅读(87)  评论(0)    收藏  举报