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

    最低分:

    \(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
    
  3. 分值 \(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


posted @ 2022-08-03 14:01  DreamerX  阅读(419)  评论(0)    收藏  举报