合肥市 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)
又是一道很水 的模拟题……
我们可以分块来处理:
-
定义变量及输入:
这部分不要讲了把……
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;
-
全校最低分、最高分的成绩及人数:
最低分:
从\(0\sim500\) 分中查找,找着就输出,然后
break
。for(int i=0;i<=500;i++)//从小到大 if(t[i]){cout<<i<<" "<<t[i]<<endl;break;}//找着就输出并结束 //注意break
最高分:
从\(500\sim0\) 分中查找,找着就输出,然后
break
。(和求最低分好像一样)for(int i=500;i>=0;i--)//从大到小 if(t[i]){cout<<i<<" "<<t[i]<<endl;break;}//找着就输出并结束 //注意break
-
分值 \(p\) 和 \(q\) 之间(包含 \(p\) 和 \(q\))人数。
不用讲了吧……
先直接扫描一遍数组,如果符合条件就
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 分(捂脸)
正式讲解:
这题不就是提高组田忌赛马原题吗 ???
你做过这道题就能轻松\(\text{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