合肥市 2020 年信息学科普日活动(小学组)题解

T1:点积运算(dot)​

题目

一道水题……

注意开 long long

代码:

//为方便在各种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;//好习惯
}

T2:成绩统计(score)

又是一道很水 的模拟题……

我们可以分块来处理:

  1. 定义变量及输入:

    这部分不要讲了把……

    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;
  2. 全校最低分、最高分的成绩及人数:

    最低分:

    0500 分中查找,找着就输出,然后break

    for(int i=0;i<=500;i++)//从小到大
    if(t[i]){cout<<i<<" "<<t[i]<<endl;break;}//找着就输出并结束
    //注意break

    最高分:

    5000 分中查找,找着就输出,然后break(和求最低分好像一样)

    for(int i=500;i>=0;i--)//从大到小
    if(t[i]){cout<<i<<" "<<t[i]<<endl;break;}//找着就输出并结束
    //注意break
  3. 分值 pq 之间(包含 pq)人数。

    不用讲了吧……

    先直接扫描一遍数组,如果符合条件就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 分(捂脸)


正式讲解:

这题不就是提高组田忌赛马原题吗 ???

你做过这道题就能轻松AC 了。

尽管题解中很多人都讲过了,但我仍然要讲一遍

首先,我们对双方的出拳个数进行从小到大排序。

接着,应为应为要进行 n 轮出拳,所以要套一个while(n--) 循环 n 次的循环,里面处理每一次赛马。

我们着重考虑赛马时的贪心:

首先把双方最高珠数尽心比较。如果小强比小明强,那就直接答案加上 50 ,再把双方尾指针向右移一位。

否则的话,比他们俩最低珠数:

小强比小明强:

那就直接把答案加上 50 ,再把双方头指针向左移一位。

小强最低珠数比小明最低珠数少:

那无论如何都是输,就直接拿最低珠数去把对方最高珠数消掉,小强的头指针向左移,对手尾指针向右移。

然后就放代码了:

ACcode:

#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


posted @   DreamerX  阅读(318)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示