2018合肥市真题题解

三角形(triangle)

题目描述
小朋友们都知道,三角形任意两边之和都大于第三边,这也是三条线段是否能构成三角形的一个必要条件,已知三条线段的长度,请同学们帮忙判断是否满足这个必要条件。
考察知识点:单for循环+if判断(注意if条件写清楚)
本题条件:是任意两边 a+b>c&&a+c>b&&b+c>a
坑点好的同学没有换行,或者不知道评测机制,评测的时候只评测输出
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,a,b,c;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a>>b>>c;
		if(a+b>c&&a+c>b&&b+c>a)
		cout<<1<<endl;
		else
		cout<<0<<endl;
	}
}

成绩统计(score) http://topscoding.com:8888/p/1527

题目描述
合肥市中小学刚刚结束期中测试,信息学老师想统计全市学生信息学成绩的得分情况,即某些分数的人数,以便改进教学内容和方法,提高同学们的信息学成绩,同学们写个程序,帮助老师实现吧。
数据范围:1≤n≤10000000,0≤k,每个分数≤100 数据范围有1千万,分数只有100,所有考虑桶排序:

桶排序需要注意特殊点:0和最大这两个点

考察知识点桶排序/简单模拟
#include<bits/stdc++.h>
using namespace std;
int n,m,c[110],a,b;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a;
		c[a]++;
	}
	for(int i=1;i<=m;i++){
		cin>>b;
		cout<<c[b]<<" ";
	}
} 
实际范围给的不大,所有双for循环也能过,如果n和k都超过1万就过不了
双for代码如下:
#include<bits/stdc++.h>
using namespace std;
int a[10000001]={0}, b[10000001]={0};
int main()
{
	int n, k;
	cin>>n>>k;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=k;i++)
		cin>>b[i];
	for(int i=1;i<=k;i++)
	{
		int t=0;
		for(int j=1;j<=n;j++)
		{
			if(a[j]==b[i])
				t++;
		}
		cout<<t<<" ";
	}
}

卡拉兹猜想(callatz) http://topscoding.com:8888/p/1528

卡拉兹在 1950年的世界数学家大会上公布了著名的卡拉兹猜想,即对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,甚至有人说这是一个阴谋,是在蓄意延缓美国数学的发展和进步。同学们,对于给定的任一不超过 1000 的正整数 n,请计算需要多少步(砍几下)才能得到 n=1。
考察知识点:简单模拟 语法while循环
按给出条件模拟,偶数:除以2,奇数:乘以3+1 看最后多少次为1
本题简单、但是不可用疏忽大意,一定要编写测试点进行自测
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,c=0;
	cin>>n;
	while(n!=1)
	{
		if(n%2==1)
		{
			n=(3*n+1)/2;
			c++;
		}
		if(n%2==0)
		{
			n/=2;
			c++;
		}
	}
	cout<<c;
}

力量对比(power) http://topscoding.com:8888/p/1529

题意:在拔河比赛中,小胖的力量特别大,一人的力量能抵得过两人的力量,凭借着小胖的出色发挥,他所在的红队最终赢得了胜利。在拔河比赛中,这样的小胖越多越好啊,而体育老师想知道有多少位这样的小胖呢。假如我们给出所有学生的力量值,且任意两位学生的力量是不同的。如何能快速知道有多少位这样的小胖呢。
考察知识点:枚举+去重(这个属于超级坑点,没考虑到这个超级坑点就是没办法了,那年一等奖应该330和小黄的短信一个意思:http://topscoding.com:8888/d/teszsb/homework/5f5ad08da0e61c000110c999/1166)这个必须做题仔细才能发觉 或者见过这种题目:一个小胖子可能是其他任意两个数的和, 这题原型:noip的第二题:珠心算测验:https://www.luogu.com.cn/problem/P2141
比如:5 1 4 2 3 这个5可以是1+4也可以是 2+3 5只能是一个小胖子而已
总结:超级坑题,所有小心驶得万年船,切记 > #### 本题实际数据范围没有给到1000,所有3for循环可以过。 >#### 代码如下:
#include<iostream>
using namespace std;
int main( )
{
    int i,j,k,a[10001],flag[10001]={0},m,n,s=0;
    cin>>m;
    for(i=1;i<=m;i++){
        cin>>a[i];
    }
    for(i=1;i<=m;i++)
        for(j=1;j<=m;j++)
            for(k=j+1;k<=m;k++)
                if(a[i]==a[j]+a[k]&&flag[i]==0){//a[i] 胖子 flag标记有没算过 
                    s++;flag[i]=1;
                }
    cout<<s;
}	
可以加入break 提高效率
#include<iostream>
#include<algorithm> 
using namespace std;
int a[1001],n,sum,t;
bool b[1001];
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	sort(a+1,a+n+1);
	for(int i=2;i<=n;i++)// 
	{
		t=0;
		for(int j=1;j<i;j++)//由前到后模拟数组值相加 
		{
			for(int k=j+1;k<i;k++)
			{
				if(a[j]+a[k]==a[i]&&!b[i])//找到一个a[i]后,将b[i]设定为真,表示已找到一个小胖 
				{
					sum++;
					b[i]=true;
					t=1; 
					break;
				}
			}
			if(t==1)//提高搜索效率 
				break;
		}
	}
	cout<<sum<<endl;
	return 0;
 } 
如果你仔细看数据范围你会发现题目数据范围是 1≤n≤1000 0<序列中每个数≤1000 那么你三重for循环枚举就会超时了1000*1000*10001后面9个0

所有改为双重

桶排序的思路 洛谷题解
#include<iostream>
#include<cstdio>
using namespace std;
int t[200005],g[200005];//t是桶,t[i]表示值为i的数在集合中两两相加出现了几次,g[i]表示值为i的数是否在集合中,1为在,0为不在
int n,a[1005],ans;
int main(){
    cin>>n;
    for (int i=1;i<=n;i++){
        cin>>a[i];//读入
        g[a[i]]=1;//在集合中赋值为1
    }
    for (int i=1;i<n;i++){//枚举
        for (int j=i+1;j<=n;j++){
            t[a[i]+a[j]]++;//被加出来了
        }
    }
    for (int i=1;i<=200002;i++){
        if (t[i]>0&&g[i]) ans++;//判断是否满足,满足ans++
    }
    cout<<ans<<endl;
    return 0;
}

数据请关注公众号:回复2018合肥获取
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值