三角形(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合肥获取