丹阳网站怎么做seo,辽宁建设厅官方网站,如何建立一个私人网站,河南县wap网站建设公司Contest1110 - 河南工大2025新生周赛#xff08;8#xff09;——命题人#xff1a;庞贺航、高旭 - HAUTOJ
A 签到题#xff1f;
读题目#xff0c;注意到α和β的值都为一#xff0c;现要求二者相加的值#xff08;经典线性求和#xff09;#xff0c;输出2即可
1…Contest1110 - 河南工大2025新生周赛8——命题人庞贺航、高旭 - HAUTOJA 签到题读题目注意到α和β的值都为一现要求二者相加的值经典线性求和输出2即可1 #includebits/stdc.h 2 using namespace std; 3 int main() 4 { 5 cout2; 6 return 0; 7 }B 数数数数数组想让数组中所有数的乘积为正即要求数组中负数的个数为偶数且不能有零。我的做法先定义一个计数器k。遍历数组时遇到0k。遇到负数负数长度并用if判断更新最接近0的负数。遍历完成后判断负数的个数如果为奇数就让最大的那个负数加到1并及时更新k。最后输出k即可。#includebits/stdc.husing namespace std;int main(){int n,k 0,lengthl 0;vectorint 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 #includebits/stdc.h2 using namespace std;3 #define int long long4 void solve() {5 int n;cinn;6 int ans0;7 int cnt0;8 int mnLLONG_MIN;9 while(n--) {10 int x;cinx;11 if(x0)continue;12 else if(x0)ans;13 else {14 cnt;15 mnmax(mn,x);16 }17 }18 if(cnt%20){}19 else ansans-mn1;20 coutansendl;21 }22 signed main() {23 int t1;24 //cint;25 while(t--) {26 solve();27 }28 return 0;29 }C 编程霸总强制爱按题意输出即可1 #includebits/stdc.h 2 using namespace std; 3 int main() 4 { 5 coutI love coding; 6 return 0; 7 }D 一觉醒来成为算法高手老师讲过这道题具体答案与老师讲的大差不差我就只写答案了。经典贪心算法。根据题目描述我们只需要以结束时间为关键字对所有颁奖从小到大排序然后从小到大依次判断是否可以参加与上一次颁奖是否有时间冲突。统计允许参加的颁奖次数并输出即可1 #includebits/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.edy.ed; 11 } 12 int main() 13 { 14 int n;cinn; 15 for(int i0;in;i) 16 { 17 cinvec[i].bgvec[i].ed; 18 } 19 sort(vec,vecn,cmp); 20 int ans1; 21 int lastedvec[0].ed; 22 for(int i1;in;i) 23 { 24 if(vec[i].bglasted) 25 { 26 ans; 27 lastedvec[i].ed; 28 } 29 } 30 coutans; 31 return 0; 32 }E 非常会伪装的金钱树我的做法是先遍历数组在for循环中i赋值给又一个for循环中的j每遇到a[i] a[j] 的情况就k记录数组a中每个数后面比它的数的个数并存入数组c中。最后输出maxc-1.即为最大数的高度。#includebits/stdc.husing 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){k0;for(int j i;j n; j){if(a[i] a[j]){k;}}c[i]k;}int max *max_element(c,cn);}cout max-1 endl;return 0;}答案根据题目描述我们实际上是要从该数组中找出最长不下降子序列然后让他们从上到下建一个每个节点都只有有一个子节点的树即为高度最大的数。所以找出最长不下降子序列并输出其长度即可找最长不下降子序列详解网上很多可自行查找并可借此机会学一下经典算法--动态规划1 #includebits/stdc.h 2 using namespace std; 3 int a[200005]; 4 int dp[200005]; 5 int main() 6 { 7 int n;cinn; 8 for(int i1;in;i)cina[i]; 9 for(int i1;in;i) 10 { 11 dp[i]1; 12 for(int j1;ji;j) 13 { 14 if(a[i]a[j])dp[i]max(dp[i],dp[j]1); 15 } 16 } 17 int ans0; 18 for(int i1;in;i)ansmax(ans,dp[i]); 19 coutansendl; 20 return 0; 21 }F 这是啥杯按题目要求输出即可1 #includebits/stdc.h 2 using namespace std; 3 int main () { 4 int a,b,c; 5 cinabc; 6 int pabc; 7 if (p 1) { 8 coutmedium cup; 9 } 10 else if (p 2) coutbig cup; 11 else if (p 3) coutsuper~ big~ cup~; 12 else coutzheshishabei?; 13 }G 编程课这道题我当时没做出来只做了一点。我就直接放答案吧。答案首先考虑到每对出列时原数组会空出来两个位置如果每一次出列都要把原数组后面的位置往前补齐显然太耗时间于是我们可以另外开两个数组为left和rightleft[i]表示编号为i的人的左边是谁right[i]表示编号为i的人的右边是谁然后每出列一对就更新这两个数组注意到舞蹈技术相差最小的一对先出列于是我们可以使用c中自带的优先队列优先队列中的每个点存相邻两个人的编号以及能力差值初始先把所有相邻的人放入优先队列优先队列依次弹出差值最小的一对弹出一对时先检查这两个人是否还相邻如果不相邻直接舍弃即可相邻就记录答案并更新left和right数组到优先队列中无元素为止。最后输出答案。1 #includebits/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 nodeoth)const 9 { 10 if(woth.w)return loth.l; 11 return woth.w; 12 } 13 }; 14 struct pii 15 { 16 int left,right; 17 }; 18 int a[200015],l[200015],r[200015]; 19 vectorpiians; 20 priority_queuenodeq; 21 int main() 22 { 23 ios::sync_with_stdio(0); 24 cin.tie(0); 25 int n;cinn; 26 string s;cins; 27 s s; 28 29 for(int i1;in;i) 30 { 31 cina[i],l[i]i-1,r[i]i1; 32 } 33 for(int i2;in;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 pq.top();q.pop(); 41 int wp.w,xp.l,yp.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]1r[y]ns[l[x]]!s[r[y]])q.push({abs(a[l[x]]-a[r[y]]),l[x],r[y]}); 52 } 53 coutans.size()endl; 54 for(auto p:ans)coutp.left p.rightendl; 55 return 0; 56 }H 进制转换我认为还是挺简单的#includebits/stdc.husing namespace std;int main() {int n, m;string numStr;// 1. 读入数据cin n; // 输入原进制 ncin numStr; // 输入 n 进制的数以字符串形式cin m; // 输入目标进制 m// 2. 第一步将 n 进制字符串转换为 十进制整数long long decimal 0; // 使用 long long 防止溢出题目说十进制值不超过 10^9int 通常够用但 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直接输出 0if (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 #includebits/stdc.h 2 using namespace std; 3 mapchar,intmp{{A,10},{B,11},{C,12},{D,13},{E,14},{F,15}}; 4 int tran10(string s,int n) 5 { 6 int res0; 7 //reverse(s.begin(),s.end()); 8 for(int i0;is.size();i) 9 { 10 resres*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 xres%pos; 20 char ch; 21 if(x10)chA(x-10); 22 else chx0; 23 sch; 24 res/pos; 25 } 26 reverse(s.begin(),s.end()); 27 return s; 28 } 29 int main() 30 { 31 int n;cinn; 32 string s;cins; 33 int pos;cinpos; 34 int restran10(s,n); 35 string anstranpos(res,pos); 36 coutans; 37 return 0; 38 39 }