8 条题解
-
11
第一次写题解,我一个第四单元都还没上完的写完这题实属不易。 代码写的不好,但至少AC了。解析在注释中。
int n,b[201]={0},num=1,biao=0,biao2,zhong2; string a[201]={"0"},x,zhong1; for (int i=1;i<=5;i++) { cin>>n;//输入后边通过人的数量。 for (int i2=1;i2<=n;i2++) { biao=0;//一个标记变量。 cin>>x; if (i2>5) { continue; }//如果排名大于五就不记分,那我还运行后面的代码干啥。 for (int i3=1;i3<num;i3++)//在数组a中搜寻这个人的名字是否存在。 { if (a[i3]==x) { biao=1; biao2=i3; break; }//如果存在就标记一下,变量biao2记录他的下标。 } if (biao==1) { if (i2==1) { b[biao2]+=5; } else if (i2==2) { b[biao2]+=3; } else if (i2>=3 && i2<=5) { b[biao2]+=1; } }//下标是一则直接判断是第几个,从而统计分数。 if (biao==0) { a[num]=x; if (i2==1) { b[num]+=5; } else if (i2==2) { b[num]+=3; } else if (i2>=3 && i2<=5) { b[num]+=1; } num++; }//下标不是一则先记录在数组a中,再判断是第几个,从而统计分数(num是指a数组用到了第几个,方便操作)。 } }//输入数据,并进行相应的计分。 //现在开始排序。(因为数少,用冒泡排序) for (int i=1;i<num;i++) { for (int i2=2;i2<num;i2++) { if (b[i2-1]<b[i2]) { zhong1=a[i2-1]; a[i2-1]=a[i2]; a[i2]=zhong1;//将名字交换。 zhong2=b[i2-1]; b[i2-1]=b[i2]; b[i2]=zhong2;//将相应的分数也交换。 } else if (b[i2-1]==b[i2]) { if (a[i2-1]>a[i2]) { zhong1=a[i2-1]; a[i2-1]=a[i2]; a[i2]=zhong1;//将名字交换。 zhong2=b[i2-1]; b[i2-1]=b[i2]; b[i2]=zhong2;//将相应的分数也交换。 } } } }//排序结束。 for (int i=1;i<num;i++) { if (b[i]==0) { break; } cout<<a[i]<<" "<<b[i]<<endl; }//输出结果。 return 0;
这些就是主体代码了(解析在注释中)。
-
8
满分做法 - 样例平均用时2ms
本题虽然难度只有4,但是涉及内容比较复杂导致尝试的人数比较少。
我用的是结构体的知识。
对于 100% 的数据, 1≤k≤200,输入的天数只有5天,所以最多可能出现的不同人名为200*5=1000个,保险起见我们可以把结构体的长度设置成1000以上的数。short k; int cnt,maxCnt; string s,nu; struct students { string name; int score; }Students[2000];
cnt的作用是记录遍历到了Students的第几个元素,便于新数据的存入。
maxCnt的作用是记录总共存入了多少个不同的人名。
s的所用是临时读入一个字符串,nu的作用是作为一个空字符串作判定用。
name用来记录名字,score用来记录积分。
由于最后需要按照字典排序,所以还要提前写好一个比较函数,配合sort使用。bool cmp(const students x, const students y) { if (x.score > y.score) { return 1; } else if (x.score == y.score) { return x.name < y.name; } return 0; }
按积分从大到小排序,积分相同的按名字字典序从小到大排序。
过多的不作阐述,请看下方main中的代码。for (short i = 0; i < 5; i++) { // 共5天,循环5次 cin >> k; // 输入k for (short j = 0; j < k; j++) { // k人,循环k次 cin >> s; // 临时读入一个字符串 cnt = 0; // 从下标0开始计数 short x=0; // 判断第j个完成题目的人可以获得多少分,默认0分 if (j == 0) { x = 5; } else if (j == 1) { x = 3; } else if (j > 1 && j < 5) { x = 1; } while (1) { // 循环直到存入数据 if (Students[cnt].name == s) { // 已经存入过这个同学的数据 Students[cnt].score += x; // 直接增加积分 break; // 退出循环 } else if (Students[cnt].name == nu) { // 没有存入过,字符串为空 Students[cnt].name = s; // 存入名字 Students[cnt].score += x; // 增加积分 break; } else { cnt++; // 该位置已经存入了一个其他同学的数据,查找下一个位置 } } maxCnt = max(maxCnt, cnt); // 记录总共存入了多少个不同的人名 } } sort(Students, Students + maxCnt + 1, cmp); // 按照字典排序 for (short i = 0; i < 2000; i++) { cout << Students[i].name << " " << Students[i].score << "\n"; if (Students[i + 1].score == 0) { // 当下一个位置的同学得分为0时,结束程序 break; } } ```
-
4
第一次写题解,注释在代码里【别想ctrl + c然后ctrl + v噢】( ̄︶ ̄)↗
int t = 1, d[205] = {0, 5, 3, 1, 1, 1}; //负责累加积分的数组
struct T { int num; // 积分统计 string s; //名字 } a[10005]; bool cmp(T x, T y) //如果积分相同就按字典序排序 否则就按积分排序 { if (x.num == y.num) return x.s < y.s; else return x.num > y.num; }
int main(){
memset(d + 6, 0, sizeof(d) - 6 * sizeof(int)); //防止越界全初始化为0 for (int i = 1; i <= 5; i++) { int x; cin >> x; for (int j = 1; j <= x; j++) { string s; cin >> s; bool flag = 1; for (int k = 1; k <= t; k++) //循环查找是否记录过 { if (a[k].s == s) { a[k].num += d[j]; //如果有就加上 flag = 0; } } if (flag) //否则就新建一个 { a[++t].s = s; a[t].num = d[j]; } } } sort(a + 1, a + t + 1, cmp); for (int i = 1; i <= t; i++) { if (a[i].num) cout << a[i].s << ' ' <<a[i].num << '\n'; } return 0;
}
-
3
AC做法
思路
首先输入每一天的人数和名字,查询每一个名字是否存在。如果不存在,就创建一个,并加上他的分数。如果存在,则直接加上分数。最后用sort排序,输出所有分数大于零的人。 (我是用一个数组存储要加的分数,所以每次加分时要判断是不是前五名)
#include<bits/stdc++.h> using namespace std; struct T{ string id;//名称 int sum;//分数 }a[100005]; int n,k,b[6]={0,5,3,1,1,1};//n为每一天的人数,k是总共人数,b数组是每个名次要加的分数 bool cmp(T a,T b){//排序规则 if(a.sum!=b.sum){//比较分数 return a.sum>b.sum; } return a.id<b.id;//分数相同时比较字典序 } int main(){ for(int i=1;i<=5;i++){ cin>>n; for(int j=1;j<=n;j++){ string s; cin>>s; bool flag=true;//如果为假,就是查到了 for(int q=1;q<=k;q++){//枚举所有人 if(a[q].id==s){ if(j<=5){ a[q].sum+=b[j]; } flag=false; break; } } if(flag){//没查到 a[++k].id=s;//创建 if(j<=5){ a[k].sum+=b[j]; } } } } sort(a+1,a+k+1,cmp);//排序 for(int i=1;i<=k;i++){ if(a[i].sum!=0){ cout<<a[i].id<<" "<<a[i].sum<<endl; } } }
看到这里,觉得好就点个赞吧!
-
-1
struct hh { string name; int x; }a[2000]; int awa(int xx) { if (xx==1) { return 5; } else if (xx==2) { return 3; } else { return 1; } } bool cmp(hh x1,hh x2) { if (x1.x==x2.x) { return x1.name<x2.name; } return x1.x>x2.x; } int k,h=0; string s; for (int i=1;i<=5;i++) { cin>>k; for (int j=1;j<=k;j++) { cin>>s; if (j<=5) { bool tf=1; for (int w=1;w<=h;w++) { if (a[w].name==s) { tf=0; a[w].x+=awa(j); break; } } if (tf) { a[++h].name=s; a[h].x+=awa(j); } } } } sort(a+1,a+h+1,cmp);
-
-17
写题解请注意
鼓励大家写题解,但注意题解格式。
题解一定要有思路解析或代码注释,能否让别人理解你的思路
也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。
给代码两端加上这个会舒服一些
```cpp
你的代码
```
</span>
这个点在键盘的左上角tab上面那个键,注意切换输入法
#include<iostream> using namespace std; int main() { int n; cin>>n;//这是一个注释 return 0; }
请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。
抄袭题解一经发现直接取消成绩。
题解被删除的可能
- 代码不符合格式规范
- 没有思路讲解或者没有注释,
- 无意义的题解
大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。
-
-17
写题解请注意 鼓励大家写题解,但注意题解格式。
题解一定要有思路解析或代码注释,能否让别人理解你的思路
也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。
给代码两端加上这个会舒服一些
```cpp
你的代码
```
</span>
这个点在键盘的左上角tab上面那个键,注意切换输入法
#include<iostream> using namespace std; int main() { int n; cin>>n;//这是一个注释 return 0; }
请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。
抄袭题解一经发现直接取消成绩。
题解被删除的可能
- 代码不符合格式规范
- 没有思路讲解或者没有注释,
- 无意义的题解
大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。
- 1
信息
- ID
- 1195
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 658
- 已通过
- 223
- 上传者