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; }

浙公网安备 33010602011771号