果洛藏族自治州网站建设_网站建设公司_导航易用性_seo优化
2025/12/17 16:44:30 网站建设 项目流程

Contest1110 - 河南工大2025新生周赛(8)——命题人:庞贺航、高旭 - HAUTOJ

A 签到题?

读题目,注意到α和β的值都为一,现要求二者相加的值(经典线性求和),输出2即可

1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 cout<<2; 6 return 0; 7 }

B 数数数数数组

想让数组中所有数的乘积为正,即要求数组中负数的个数为偶数且不能有零。

我的做法:先定义一个计数器k。遍历数组时遇到0,k++。遇到负数,负数长度++并用if判断更新最接近0的负数。遍历完成后判断负数的个数,如果为奇数,就让最大的那个负数加到1,并及时更新k。最后输出k即可。

#include<bits/stdc++.h>
using namespace std;
int main(){
int n,k = 0,lengthl = 0;
vector<int> a(n);
cin >> n;
long long min = -100000;
for(int i = 0;i < n;i++){
cin >> a[i];
if(a[i] == 0) {k++;}
else if(a[i] < 0) {
lengthl++;
if(min < a[i]) {min = a[i];}
}
}
if(lengthl%2 == 0) cout << k << endl;
else{
while(min <= 0){min += 1;k++;}
cout << k << endl;
}
return 0;
}

答案:先统计负数的个数,如果为奇数,就让最大的那个负数加到1,再让数组中所有的零都加到1,最后输出操作次数即可

1 #include<bits/stdc++.h>

2 using namespace std;

3 #define int long long

4 void solve() {

5 int n;cin>>n;

6 int ans=0;

7 int cnt=0;

8 int mn=LLONG_MIN;

9 while(n--) {

10 int x;cin>>x;

11 if(x>0)continue;

12 else if(x==0)ans++;

13 else {

14 cnt++;

15 mn=max(mn,x);

16 }

17 }

18 if(cnt%2==0){}

19 else ans=ans-mn+1;

20 cout<<ans<<endl;

21 }

22 signed main() {

23 int t=1;

24 //cin>>t;

25 while(t--) {

26 solve();

27 }

28 return 0;

29 }

C 编程霸总强制爱

按题意输出即可

1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 cout<<"I love coding"; 6 return 0; 7 }

D 一觉醒来成为算法高手

老师讲过这道题,具体答案与老师讲的大差不差,我就只写答案了。

经典贪心算法。根据题目描述,我们只需要以结束时间为关键字对所有颁奖从小到大排序,然后从小到大依次判断是否可以参加(与上一次颁奖是否有时间冲突)。统计允许参加的颁奖次数并输出即可

1 #include<bits/stdc++.h> 2 using namespace std; 3 struct node 4 { 5 int bg,ed; 6 }; 7 node vec[200005]; 8 bool cmp(node x,node y) 9 { 10 return x.ed<y.ed; 11 } 12 int main() 13 { 14 int n;cin>>n; 15 for(int i=0;i<n;i++) 16 { 17 cin>>vec[i].bg>>vec[i].ed; 18 } 19 sort(vec,vec+n,cmp); 20 int ans=1; 21 int lasted=vec[0].ed; 22 for(int i=1;i<n;i++) 23 { 24 if(vec[i].bg>=lasted) 25 { 26 ans++; 27 lasted=vec[i].ed; 28 } 29 } 30 cout<<ans; 31 return 0; 32 }

E 非常会伪装的金钱树

我的做法是先遍历数组,在for循环中i赋值给又一个for循环中的j,每遇到a[i] <= a[j] 的情况就k++记录数组a中每个数后面比它>=的数的个数,并存入数组c中。最后输出max(c)-1.即为最大数的高度。

#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
int a[n];
for(int i = 0;i < n; i++){
cin >>a[i];
}
int c[n];
int k;
for(int i = 0;i < n; i++){
k=0;
for(int j= i;j< n; j++){
if(a[i]<= a[j]){k++;}
}
c[i]=k;
}
int max =*max_element(c,c+n);
}
cout << max-1 << endl;
return 0;
}

答案:根据题目描述,我们实际上是要从该数组中找出最长不下降子序列,然后让他们从上到下建一个每个节点都只有有一个子节点的树,即为高度最大的数。所以找出最长不下降子序列并输出其长度即可(找最长不下降子序列详解网上很多可自行查找,并可借此机会学一下经典算法--动态规划)

1 #include<bits/stdc++.h> 2 using namespace std; 3 int a[200005]; 4 int dp[200005]; 5 int main() 6 { 7 int n;cin>>n; 8 for(int i=1;i<=n;i++)cin>>a[i]; 9 for(int i=1;i<=n;i++) 10 { 11 dp[i]=1; 12 for(int j=1;j<i;j++) 13 { 14 if(a[i]>=a[j])dp[i]=max(dp[i],dp[j]+1); 15 } 16 } 17 int ans=0; 18 for(int i=1;i<=n;i++)ans=max(ans,dp[i]); 19 cout<<ans<<endl; 20 return 0; 21 }

F 这是啥杯

按题目要求输出即可

1 #include<bits/stdc++.h> 2 using namespace std; 3 int main () { 4 int a,b,c; 5 cin>>a>>b>>c; 6 int p=a+b+c; 7 if (p == 1) { 8 cout<<"medium cup"; 9 } 10 else if (p == 2) cout<<"big cup"; 11 else if (p == 3) cout<<"super~ big~ cup~"; 12 else cout<<"zheshishabei?"; 13 }

G 编程课

这道题我当时没做出来,只做了一点。我就直接放答案吧。

答案:首先考虑到每对出列时原数组会空出来两个位置,如果每一次出列都要把原数组后面的位置往前补齐显然太耗时间,于是我们可以另外开两个数组为left和right,left[i]表示编号为i的人的左边是谁,right[i]表示编号为i的人的右边是谁,然后每出列一对就更新这两个数组,注意到舞蹈技术相差最小的一对先出列,于是我们可以使用c++中自带的优先队列,优先队列中的每个点存相邻两个人的编号以及能力差值,初始先把所有相邻的人放入优先队列,优先队列依次弹出差值最小的一对,弹出一对时先检查这两个人是否还相邻,如果不相邻直接舍弃即可,相邻就记录答案并更新left和right数组,到优先队列中无元素为止。最后输出答案。

1 #include<bits/stdc++.h> 2 using namespace std; 3 #define endl '\n' 4 struct node 5 { 6 int w; 7 int l,r; 8 bool operator<(const node&oth)const 9 { 10 if(w==oth.w)return l>oth.l; 11 return w>oth.w; 12 } 13 }; 14 struct pii 15 { 16 int left,right; 17 }; 18 int a[200015],l[200015],r[200015]; 19 vector<pii>ans; 20 priority_queue<node>q; 21 int main() 22 { 23 ios::sync_with_stdio(0); 24 cin.tie(0); 25 int n;cin>>n; 26 string s;cin>>s; 27 s=" "+s; 28 29 for(int i=1;i<=n;i++) 30 { 31 cin>>a[i],l[i]=i-1,r[i]=i+1; 32 } 33 for(int i=2;i<=n;i++) 34 { 35 if(s[i]!=s[i-1]) 36 q.push({abs(a[i]-a[i-1]),i-1,i}); 37 } 38 while(q.size()) 39 { 40 auto p=q.top();q.pop(); 41 int w=p.w,x=p.l,y=p.r; 42 if(r[x]!=y||l[y]!=x) 43 { 44 continue; 45 } 46 ans.push_back({x,y}); 47 if(l[x]>=1) 48 r[l[x]]=r[y]; 49 if(r[y]<=n) 50 l[r[y]]=l[x]; 51 if(l[x]>=1&&r[y]<=n&&s[l[x]]!=s[r[y]])q.push({abs(a[l[x]]-a[r[y]]),l[x],r[y]}); 52 } 53 cout<<ans.size()<<endl; 54 for(auto p:ans)cout<<p.left<<' '<<p.right<<endl; 55 return 0; 56 }

H 进制转换

我认为还是挺简单的:

#include<bits/stdc++.h>

using namespace std;

int main() {
int n, m;
string numStr;

// 1. 读入数据
cin >> n; // 输入原进制 n
cin >> numStr; // 输入 n 进制的数(以字符串形式)
cin >> m; // 输入目标进制 m

// 2. 第一步:将 n 进制字符串转换为 十进制整数
long long decimal = 0; // 使用 long long 防止溢出,题目说十进制值不超过 10^9,int 通常够用,但 long long 更保险
for (char c : numStr) {
int digit;
// 将字符转换为对应的数值 (0-15)
if (c >= '0' && c <= '9') {
digit = c - '0';
} else {
digit = c - 'A' + 10; // 'A' 代表 10
}
// 按位权展开累加
decimal = decimal * n + digit;
}

// 3. 第二步:将 十进制整数 转换为 m 进制字符串
// 特殊情况:如果十进制数是 0,直接输出 "0"
if (decimal == 0) {
cout << "0" << endl;
return 0;
}

string result = "";
while (decimal > 0) {
int remainder = decimal % m; // 取余数
char digitChar;
// 将余数转换为对应的字符
if (remainder < 10) {
digitChar = '0' + remainder;
} else {
digitChar = 'A' + remainder - 10;
}
result += digitChar; // 将字符添加到结果字符串末尾
decimal /= m; // 更新商
}

// 4. 因为我们是倒着取余数的,所以需要将字符串反转
reverse(result.begin(), result.end());

// 5. 输出结果
cout << result << endl;

return 0;
}

答案:先将原数按位处理转换为十进制,再由十进制用迭代取余,不停的除以目标进制并依次记录余数,最后倒叙输出余数即为转换后的数

1 #include<bits/stdc++.h> 2 using namespace std; 3 map<char,int>mp={{'A',10},{'B',11},{'C',12},{'D',13},{'E',14},{'F',15}}; 4 int tran10(string s,int n) 5 { 6 int res=0; 7 //reverse(s.begin(),s.end()); 8 for(int i=0;i<s.size();i++) 9 { 10 res=res*n+(isdigit(s[i])?(s[i]-'0'): mp[s[i]]); 11 } 12 return res; 13 } 14 string tranpos(int res,int pos) 15 { 16 string s=""; 17 while(res) 18 { 19 int x=res%pos; 20 char ch; 21 if(x>=10)ch='A'+(x-10); 22 else ch=x+'0'; 23 s+=ch; 24 res/=pos; 25 } 26 reverse(s.begin(),s.end()); 27 return s; 28 } 29 int main() 30 { 31 int n;cin>>n; 32 string s;cin>>s; 33 int pos;cin>>pos; 34 int res=tran10(s,n); 35 string ans=tranpos(res,pos); 36 cout<<ans; 37 return 0; 38 39 }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询