关键词:
北京中关村;海淀黄庄;北京大学;清华大学。少儿编程;中小学编程;信息学竞赛;计算机竞赛;NOIP;NOIP竞赛;CSP-J/S竞赛;NOI竞赛。北京中学;东坝。
2010年、普及组、复赛,第16届。
面向6-18岁中小学生,做最专业的中小学编程教育。
解析与答案:
A、试题类型:
数学问题。
B、算法模型:
暴力搜索与递归。
C、试题说明:
无。
#include<bits/stdc++.h>
using namespace std ;
int l , r ;
int ans = 0 ;
void sss (int x )
{
if( x == 0 ) return; // 递归函数需要边界
else if( x % 10 == 2 ) ans ++; //如果扫到2出现了ans加1
sss ( x / 10 ); // 然后把最后一位去掉接着扫
}
int main ()
{
scanf ("%d %d",& l ,& r ); // 输入l和r
for(int i = 1 ; i <= r ; i ++)
{ // 循环直接扫一遍
sss ( i );
}
printf ("%d", ans );
return 0 ;
}
非递归:
#include<bits/stdc++.h>
using namespace std ;
int l , r ;
int ans = 0 ;
void sss (int x )
{
if( x == 0 ) return; // 递归函数需要边界
else if( x % 10 == 2 ) ans ++; //如果扫到2出现了ans加1
sss ( x / 10 ); // 然后把最后一位去掉接着扫
}
int main ()
{
scanf ("%d %d",& l ,& r ); // 输入l和r
for(int i = 1 ; i <= r ; i ++)
{ // 循环直接扫一遍
sss ( i );
}
printf ("%d", ans );
return 0 ;
}
A、试题类型:
STL应用问题。
B、算法模型:
优先队列(或者说“最小堆”)来进行求解。
C、试题说明:
优先队列在C++的queue库中有一个priority_queue的实现。
对于这道题:首先将m个数放入优先队列,然后每次从其中取出一个最小的数,再将这个数加上接下来要进去的那个人k对应的数(即为k离开的时间)。最后将优先队列里面的所有数取出来,其中最大的那个数就是答案。
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
priority_queue<int, vector<int>, greater<int> > que;
int n, m, a[10010], res = 0;
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i ++)
cin >> a[i];
for (int i = 0; i < m; i ++)
que.push(a[i]);
for (int i = m; i < n; i ++)
{
int t = que.top();
que.pop();
que.push(a[i] + t);
}
while (!que.empty())
{
int t = que.top();
que.pop();
if (t > res)
res = t;
}
cout << res << endl;
return 0;
}
A、试题类型:
数学结合。
B、算法模型:
基本数据公式。
C、试题说明:
先将每个导弹与第一个系统的距离的平方算出来。
再对距离的平方进行从大到小排序。
从1开始枚举每个导弹由二系统拦截的情况。
每次更新二系统的最大半径和答案的最小值。
#include<cstdio>
#include<algorithm>
using namespace std;
int x1,yl,x2,y2,n,ans,r1,r2;
struct node
{
int x,y,d1;
}mis[100005]; //表示横纵坐标和与一系统的距离平方
int dis(int x,int y,int a,int b)
{
return (x-a)*(x-a)+(y-b)*(y-b);
} //因为精度的问题所以直接用平方来存距离
bool cmp(node a,node b)
{
return a.d1>b.d1;
} //由大到小排序
int main()
{
int x,y;
scanf("%d%d%d%d%d",&x1,&yl,&x2,&y2,&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
mis[i].x=x;
mis[i].y=y;
mis[i].d1=dis(x1,yl,mis[i].x,mis[i].y);
}
sort(mis+1,mis+n+1,cmp);
r1=mis[1].d1;
ans=r1;
for(int i=2;i<=n+1;i++) //一定要注意这里是n+1,因为可能一系统一个导弹都没拦截
{
r1=mis[i].d1;
r2=max(r2,dis(x2,y2,mis[i-1].x,mis[i-1].y)); //更新二系统半径平方最大值
ans=min(ans,r1+r2); //更新答案最小值
}
printf("%d",ans);
return 0;
}
A、试题类型:
算法问题。
B、算法模型:
贪心。
C、试题说明:
A、在任何的操作之中,要注意不重不漏(重复的计算可能会导致运算的东西不对,有遗漏的计算会导致缺失部分数据。
B、贪心的策略要经过理论的判断。
#include<bits/stdc++.h>
using namespace std;
int a[501][501]={0};
int main()
{
int n;
cin>>n;
int score=0;
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
a[i][j]=a[j][i];
}
}
for(int i=1;i<=n;i++)
{
sort(a[i]+1,a[i]+n+1);
score=max(score,a[i][n-1]);
}
cout<<"1"<<endl<<score;
return 0;
}
IT航班提供:课程视频、、课程书籍、竞赛辅导、少儿编程指导、课程采购、加盟、少儿编程资料、少儿编程课程、保送生、特长生、加分、中小学计算机教育、中小学信息学、竞赛、中小学信息学课程、人工智能、中小学编程加盟、少儿编程加盟、品牌加盟、技术加盟、技术指导、课程加盟、师资培训、中小学编程教辅资料、中小学编程教师培训、少儿编程教学书籍、少儿编程视频、教学书籍、教师培训、教学视频、CSP-J/S、中小学信息学课程服务、竞赛指导、课程提供、国内外计算机中小学计算机竞赛、信息学竞赛、信息学课程提供商、信息学奥林匹克。
联系方式:
A、官方网址:
B、微信公众号:
添加微信,获取资料。
关注公众号,获取动态。