主页
搜索
最近更新
数据统计
赞助我们
系统公告
1
/
1
请查看完所有公告
2025年6月15日综合测试
最后更新于 2025-06-15 18:57:26
作者
Har10
分类
个人记录
复制 Markdown
查看原文
更新内容
# T226001 【排序】桶排序 ### 赛时代码 ```cpp #include <bits/stdc++.h> using namespace std; int n,a[10000]; int main() { cin >> n; for(int i=1;i<=n;i++) { cin >> a[i]; } sort(a+1,a+n+1); for(int i=1;i<=n;i++) { cout << a[i] << " "; } return 0; } ``` 虽然对了,但是我没用桶排序。写一下正确思路。 ### 正确思路 用桶,来给数据从小到大排序。 #### 正确代码 ```cpp #include<bits/stdc++.h> using namespace std; #define endl '\n' typedef long long ll; const int N = 2e5 + 10; int t[101]; int a[1001]; int n; int main() { cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; t[a[i]]++; } // 输出桶的编号 for (int i = 1; i <= 100; i++) { // 数字i在a数组中出现了t[i]次,所以需要循环 for (int j = 1; j <= t[i]; j++) { cout<< i<< " "; } } return 0; } ``` # T619879 整理抽屉 ### 赛时代码 1.思路错误:不知道如何去记录每个科目的数量。 ```cpp #include <bits/stdc++.h> using namespace std; int n; string s; int a,b,c,d; int main() { cin >> n; for(int i=1;i<=n;i++)//错误1:不知道如何去记录每个科目的数量。 { cin >> s; if(s=="chinese") { a++; } if(s=="physics") { b++; } if(s=="english") { c++; } if(s=="math") { d++; } } if(a>b&&a>c&&a>d) { cout << "chinese"; return 0; } if(b>a&&b>c&&b>d) { cout << "physics"; return 0; } if(c>b&&c>a&&c>d) { cout << "english"; return 0; } if(d>b&&d>c&&d>a) { cout << "math"; return 0; } cout << "chinese"; return 0; } ``` ### 正确思路 这道题中,抽屉:用来记录每个字符串出现的次数。最后输出最多的字符串。 #### 正确代码 ```cpp #include<bits/stdc++.h> #define int long long using namespace std; int n,maxi; string ans; // 抽屉:记录每个字符串出现的次数,输出出现次数最多的那个字符串 map<string, int> t; // 相当于字符串的桶 void solve() { cin>>n; string x; for(int i=1;i<=n;++i) { cin>>x; if(t[x] > maxi) { maxi = t[x]; ans = x; } } cout<<x; } signed main() { ios::sync_with_stdio(false); cin.tie(0); solve(); return 0; } ``` # T619884 成绩排序 ### 赛时代码 ```cpp #include <bits/stdc++.h> using namespace std; int n; struct node { string name; int c; }; node a[105]; bool cmp(node x,node y) { if(x.c!=y.c) { return x.c>y.c; } if(x.c==y.c&&x.name!=y.name) { return x.name<y.name; } } int main() { cin >> n; for(int i=1;i<=n;i++) { cin >> a[i].name >> a[i].c; } sort(a+1,a+n+1,cmp); for(int i=1;i<=n;i++) { cout << a[i].name << " " << a[i].c << endl; } return 0; } ``` 这道题对了,思路细节都没问题。 # T619421 陶陶摘苹果 ### 赛时代码 1.细节错误:没注意题目中,陶陶的高度大于等于苹果的高度就可以摘到。 ```cpp #include <bits/stdc++.h> using namespace std; int n,a,s,b,cnt; struct node { int g,l; }; node z[10000005]; bool cmp(node x,node y) { return x.l<y.l; } int main() { cin >> n >> s >> a >> b; for(int i=1;i<=n;i++) { cin >> z[i].g >> z[i].l; } sort(z+1,z+n+1,cmp); for(int i=1;i<=n;i++) { if(z[i].g<a+b&&s-z[i].l>=0)//1.细节错误:陶陶的高度大于等于苹果的高度就可以摘到。 { cnt++; s-=z[i].l; } else if(s-z[i].l<0) { cout << cnt; return 0; } } cout << cnt; return 0; } ``` ### 正确代码 ```cpp #include<bits/stdc++.h> using namespace std; struct node { int x, y; // x:⾼度 y:需要的⼒⽓ }ap[5005]; // 按需要的⼒⽓从⼩到⼤排序 bool cmp (node a, node b) { return a.y < b.y; // 需要⼒⽓越⼩的苹果越好拿 // 就可以留出更多的⼒⽓去拿剩余的苹果 } int n, s, a, b, cnt; //a+b就是淘淘最⼤的⾼度 int main() { cin >> n >> s >> a >> b; for (int i = 1; i <= n; i++) { cin >> ap[i].x >> ap[i].y; } sort(ap + 1, ap + 1 + n, cmp); for (int i = 1; i <= n; i++) { //选择需要⼒⽓最少 且 能够到的苹果 if (s >= ap[i].y && a + b >= ap[i].x) { s -= ap[i].y; // 消耗⼒⽓ cnt++; // 摘到苹果 } } cout << cnt; return 0; } ``` # T619883 正整数N转换成一个二进制数 ## 正确思路 不停的除以2,余数就是⼆进制的每⼀位 记得最后要反转输出。可以先⽤数组存储每次得到的余数。 ### 正确代码 ```cpp #include<bits/stdc++.h> using namespace std; #define endl '\n' typedef long long ll; const int N = 2e5 + 10; /* 不停的除以2,余数就是⼆进制的每⼀位 记得最后要反转输出。可以先⽤数组存储每次得到的余数。 */ int a[1000], idx; int main() { int n; cin >> n; if ( n == 0 ) { cout << 0; return 0; } while(n) { a[++idx] = n % 2; n /= 2; } for (int i = idx; i >= 1; i--) { cout << a[i]; } return 0; } ``` # T619885 【模板】栈 ### 赛时代码 1.细节错误:对栈的掌握没那么熟悉。 ```cpp #include <bits/stdc++.h> using namespace std; int s[10000005],top; int T,n,x; string a; int main() { cin >> T; while(T--)//1.细节错误:对栈的掌握没那么熟悉。 { cin >> n; for(int i=1;i<=n;i++) { cin >> a; if(a=="push") { cin >> x; s[++top]=x; } else if(a=="pop") { if(top==0) { cout << "Empty"; } else { top--; } } else if(a=="query") { if(top==0) { cout << "Anguei!"; } else { cout << s[top]; } } else if(a=="size") { cout << top; } } } return 0; } ``` ### 正确代码 ```cpp #include<bits/stdc++.h> using namespace std; stack<unsigned long long> s; // 创建栈 int t; string c; unsigned long long x; int n; int main(){ cin>>t; for(int i=1;i<=t;i++){ cin>>n; for(int j=1;j<=n;j++){ cin>>c; if(c=="push"){ cin>>x; s.push(x); // ⼊栈 } else if(c=="pop"){ if(s.size()==0){ // 栈中的元素数量 cout<<"Empty"<<endl; }else{ s.pop(); // 出栈 } } else if(c=="query"){ if(s.size()==0){ cout<<"Anguei!"<<endl; }else{ cout<<s.top()<<endl; } } else if(c=="size"){ cout<<s.size()<<endl; } } // 清空栈 // while(s.size()) { // s.pop(); // } } return 0; } ``` # T619886 【模板】队列 ### 赛时代码 1.细节错误:对队列的掌握没那么熟悉,忘了。 ```cpp #include <bits/stdc++.h> using namespace std; int s[10000005],top; int T,n,x; string a; int main() { cin >> n;//1.细节错误:对队列的掌握没那么熟悉,忘了,直接用了上题的代码。 for(int i=1;i<=n;i++) { cin >> a; if(a=="1") { cin >> x; s[++top]=x; } else if(a=="2") { if(top==0) { cout << "ERR_CANNOT_POP"; } else { top--; } } else if(a=="3") { if(top==0) { cout << "ERR_CANNOT_POP"; } else { cout << s[top]; } } else if(a=="4") { cout << top; } } return 0; } ``` ### 正确代码 ```cpp #include<bits/stdc++.h> using namespace std; queue<int> q; // 创建队列 int main(){ int n; cin>>n; for(int i=1;i<=n;i++){ int a,x; cin>>a; if(a==1){ cin>>x; q.push(x); // ⼊队 } else if(a==2){ if(q.size()==0){ // 队列中的元素个数 cout<<"ERR_CANNOT_POP"<<endl; } else{ q.pop(); // 出队 } } else if(a==3){ if(q.size()==0){ cout<<"ERR_CANNOT_QUERY"<<endl; } else{ cout<<q.front()<<endl; // 输出队⾸ } } else if(a==4) { cout << q.size()<<endl; } } return 0; } ``` ## T619887 最大公约数 ### 赛时代码 ```cpp #include <bits/stdc++.h> using namespace std; int main() { int x,y,z; cin >> x >> y >> z; cout << __gcd(x,__gcd(y,z)); return 0; } ``` 这道题对了,思路细节都没问题。 # T619888 宇宙总统 ### 正确思路 用结构体排序,输出最大值的序号和最大值。 ### 正确代码 ```cpp #include<bits/stdc++.h> using namespace std; struct node{ int num; // 编号 string s; // 得票数 }a[25]; bool cmp (node x, node y) { if(x.s.size() == y.s.size()) return x.s > y.s; return x.s.size() > y.s.size(); } int n; int main() { cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i].s; a[i].num = i; } sort(a + 1, a + 1 + n, cmp); // for (int i = 1; i <= n; i++) { // cout << a[i].s << endl; // } cout << a[1].num << endl; cout << a[1].s; return 0; } ``` # T619481 进制转换 ### 正确思路 输⼊ 个整数与其进制 ,对于每⼀个整数,我们求它得⼗进制并输出。 分析 “对于任意⼀个 位 进制数,假设其最右边的数位为第 位,最左边的 数位为第 位,我们只需要将其第 i 位的数码乘以权值 ,再将每位 ```cpp #include<bits/stdc++.h> using namespace std; struct node{ int num; // 编号 string s; // 得票数 }a[25]; bool cmp (node x, node y) { if(x.s.size() == y.s.size()) return x.s > y.s; return x.s.size() > y.s.size(); } int n; int main() { cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i].s; a[i].num = i; } sort(a + 1, a + 1 + n, cmp); // for (int i = 1; i <= n; i++) { // cout << a[i].s << endl; // } cout << a[1].num << endl; cout << a[1].s; return 0; } ``` 这⾥涉及到⼀个概念:位权。 什么是位权呢?我们拿⼀个⼗进制数 举例: ⽽ 就是每⼀位代表的实际数值之和。 相信⼤家有思路了吧!第 位的位权,就代表这⼀位上每⼀个 代表的数 量。 这是⼗进制中的位权。但如果这个 是⼋进制数呢? 这⼏个数值加起来,刚好就是⼋进制数 的⼗进制形式 。 看到这⾥,相信⼤家都明⽩怎么写代码了吧!但是还有⼏个易错点我要讲⼀讲。 string ! 的结果相加,即可得到原 进制数对应的⼗进制数。 ” ### 正确代码 ```cpp #include <iostream> #include <cmath> using namespace std; long long n; long long k; long long num[15]; string snum; int main() { cin >> n;//处理输⼊ while (n--) { cin >> k >> snum;//处理输⼊ long long ans = 0; for (long long i = 0; i < snum.size(); i++) { if (!(snum[i] >= '0' && snum[i] <= '9')) { num[i] = snum[i]-'A'+10; } else { num[i] = snum[i]-'0'; } ans = ans * k + num[i]; //我们可以直接在处理字符的时候直接进⾏累加。 //当然,更直接的做法就是不要num数组,直接处理完后累加。 } cout << ans << endl;//记得输出! } return 0; } ```
正在渲染内容...
点赞
0
收藏
0