合肥市 2020 年信息学科普日活动(小学组)题解
:点积运算(dot)
一道水题……
注意开
代码:
//为方便在各种OJ上提交,本文代码一律不加文件操作,但考试时是要加上的(后文不再提示) #include<bits/stdc++.h> using namespace std; int main() { long long a,b,c,d;//开long long或__int64(但似乎__int64乘法要慢一些???) cin>>a>>b>>c>>d; cout<<(a*c)+(b*d);//输出(看题意) return 0;//好习惯 }
:成绩统计(score)
又是一道很水 的模拟题……
我们可以分块来处理:
-
定义变量及输入:
这部分不要讲了把……
int n,a[10009],p,q,t[509]; cin>>n; for(int i=1;i<=n;i++) cin>>a[i],t[a[i]]++; cin>>p>>q; -
全校最低分、最高分的成绩及人数:
最低分:
从
分中查找,找着就输出,然后break
。for(int i=0;i<=500;i++)//从小到大 if(t[i]){cout<<i<<" "<<t[i]<<endl;break;}//找着就输出并结束 //注意break 最高分:
从
分中查找,找着就输出,然后break
。(和求最低分好像一样)for(int i=500;i>=0;i--)//从大到小 if(t[i]){cout<<i<<" "<<t[i]<<endl;break;}//找着就输出并结束 //注意break -
分值
和 之间(包含 和 )人数。不用讲了吧……
先直接扫描一遍数组,如果符合条件就
s++
。int s=0; for(int i=1;i<=n;i++) if(a[i]>=p&&a[i]<=q) s++; cout<<s;
最后,记得 return 0;
出队游戏(queue)
这道题其实就是一个约瑟夫问题的变形。
考试前幸好听了老师的话,刷了几题约瑟夫的题
当时考场上就是用普通模拟写的,考试后听老师说要用链表什么的写,下了个半死
但貌似我没超时????
具体思路看代码
#include<bits/stdc++.h> using namespace std; bool a[10009];//a数组表示为0没被踢,为1已经被踢了 int main() { int n,s=2,c,v=0;//c为剩下人数,v为临时变量,s为每隔s个人就踹掉一个 cin>>n; c=n; while(c>3)//还剩超过3个人 { for(int i=1;i<=n;i++) { v+=(!a[i]); if(v==s)//到了s个人 { v=0;//计数器清零 a[i]=1;//这个人被踢了 c--;//人数减一 } } v=0;//计数器要再次归0(我在这里又被卡了)(划去) s=(s==3?2:3); //注意,隔s个人中, //s只可能是2或3 //我当时就被坑了(捂脸ε=ε=ε=┏(゜ロ゜;)┛) } for(int i=1;i<=n;i++) if(!a[i]) printf("%d ",i);//如果没被踢,就输出 return 0;//好习惯 }
盲比多少游戏(game)
写在前面:
当时比赛只骗了 30 分(捂脸)
正式讲解:
这题不就是提高组田忌赛马原题吗 ???
你做过这道题就能轻松
尽管题解中很多人都讲过了,但我仍然要讲一遍
首先,我们对双方的出拳个数进行从小到大排序。
接着,应为应为要进行 while(n--)
循环
我们着重考虑赛马时的贪心:
首先把双方最高珠数尽心比较。如果小强比小明强,那就直接答案加上
,再把双方尾指针向右移一位。 否则的话,比他们俩最低珠数:
小强比小明强:
那就直接把答案加上
,再把双方头指针向左移一位。 小强最低珠数比小明最低珠数少:
那无论如何都是输,就直接拿最低珠数去把对方最高珠数消掉,小强的头指针向左移,对手尾指针向右移。
然后就放代码了:
#include<bits/stdc++.h> using namespace std; int tj[10004],king[10004]; int n; int main() { cin>>n; int ans=0; for(int i=1;i<=n;i++) cin>>tj[i]; for(int i=1;i<=n;i++) cin>>king[i]; sort(tj+1,tj+n+1); sort(king+1,king+1+n);//排序 int kn=n,tn=n,ti=1,ki=1; while(n--)//一共n轮比赛 { if(tj[tn]>king[kn]) ans+=50,kn--,tn--;//最大的打得过对方的最大的 else if(tj[ti]>king[ki]) ans+=50,ki++,ti++;//最小的打得过对方的最小的 else if(tj[ti]<king[kn]) ans-=50,ti++,kn--;//反正都打不过,消去他最大的 } cout<<ans;//输出答案 return 0; }
THE END
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效