众数(masses)
【问题描述】
由文件给出N个1到30000 间无序数正整数,其中 1≤N≤10000,同一个正整数可能会出现多次,出现次数最多的整数称为众数。求出它的众数及它出现的次数。
【输入格式】
输入文件第一行是正整数的个数 N,第二行开始为 N 个正整数。
【输出格式】
输出文件有若干行,每行两个数,第 1 个是众数,第 2 个是众数出现的次数。
【输入样例】
12
2 4 2 3 2 5 3 7 2 3 4 3
【输出样例】
2 3
3 4
标程如下:
#include
#include
#include
using namespace std;
long long a[40000];
int main ()
{
long long n,i,j,m,s,t,max;
cin>>n;
max=0;
for (i=1; i<=30000; i++)
a[i]=0;
for (i=1; i<=n; i++)
{
cin>>t;
a[t]=a[t]+1;
}
for (i=1; i<=30000; i++)
if (a[i]>max)
max=a[i];
for (i=1; i<=30000; i++)
if (a[i]max) cout<<i<<" “<<max<<endl;
}
这道题考试时众数最大值初始值定义为1了,虽然样例过了,但是评测的时候wa了。反映出考试是基础知识不扎实,考虑不周,以后应多试几组样例。
第 k 小整数(knumber)
【问题描述】
现有 n 个正整数,n≤10000,要求出这 n 个正整数中的第 k 个最小整数(相同大小的整数只计算一次),k≤1000,正整数均小于 30000。
【输入格式】
第一行为 n 和 k,第二行开始为 n 个正整数的值,整数间用空格隔开。
【输出格式】
第 k 个最小整数的值;若无解,则输出“NO RESULT”。
【输入样例】 10 3
1 3 3 7 2 5 1 2 4 6
【输出样例】
3
答案:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[30000];
memset(a,0,sizeof(a));
int n,k;
scanf(”%d%d",&n,&k);
int x;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
a[x]++;
}
int j=0,flag=0;
for(int i=1;i<30000;i++)
{
if(a[i]!=0)
{
j++;
if(jk)
{
flag=1;
printf("%d",i);
break;
}
}
}
if(flag0)
{
printf(“NO RESULT”);
}
return 0;
}
这道题考试时第二个循环边界点判断错误,以后还需注意。
5、军事机密(secret)
【问题描述】
军方截获的信息由 n(n<=30000)个数字组成,因为是敌国的高端秘密,所以一时不能破获。最原始的想法就是对这 n 个数进行从小到大排序,每个数都对应一个序号,然后对第 i 个是什么数感兴趣,现在要求编程完成。
【输入格式】
第一行 n,接着是 n 个截获的数字,接着一行是数字 k,接着是 k 行要输出数的序号。
【输出格式】
k 行序号对应的数字。
【输入样例】
5
121 1 126 123 7
3
2
4
3
【输出样例】
7
123
121
输出时忘换行!下次再错罚50个蹲起!
8、输油管道问题(pipe)
【问题描述】
某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有n 口油井的油田。从每口油井都要有一条输油管道沿最短路径(或南或北)与主管道相连。如果给定n口油井的位置,即它们的x 坐标(东西向)和y 坐标(南北向),应如何确定主管道的最优位置,即使各油井到主管道之间的输油管道长度总和最小的位置?证明可在规定时间内确定主管道的最优位置。
【编程任务】
给定n 口油井的位置,编程计算各油井到主管道之间的输油管道最小长度总和。
【输入格式】
第1 行是油井数n,1≤n≤10000。接下来n 行是油井的位置,每行2个整数x和y,-10000≤x,y≤10000。
【输出格式】
第1 行中的数是油井到主管道之间的输油管道最小长度总和。
【输入样例】
5
1 2
2 2
1 3
3 -2
3 3
【输出样例】
6
#include<bits/stdc++.h>
using namespace std;
int x[10001],y[10001];
int main()
{
int n,zb1,zb2,total=0;
cin>>n;
for(int i=1;i<=n;i++)
cin>>x[i]>>y[i];
sort(y+1,y+(n+1));
if(n%20)
{
zb1=(y[n/2]+y[n/2+1])/2;
}
else
{
zb1=y[n/2+1];
}
for(int i=1;i<=n;i++)
{
total+=abs(zb1-y[i]);
}
cout<<total<<endl;
return 0;
}
这道题奇偶欠考虑!