现有n个正整数,n≤100000,要求出这n个正整数中的第k个最小整数(相同大小的整数只计算一次),k≤400。
输入第1行为n和k,第2行开始为n个正整数的值,整数间用空格隔开。输出第k个最小整数的值;若无解,则输出“NORESULT”。#include<stdio.h>intma...
输入
第1行为n和k,第2行开始为n个正整数的值,整数间用空格隔开。
输出
第k个最小整数的值;若无解,则输出“NO RESULT”。
#include<stdio.h>
int main(void){
int a[101][101];
int b[101][101] = {0};
int n,k;
int i,j,l,c,d;
int count = 0;
scanf("%d%d",&n,&k);
for(i=0;i<100; i++)
for(j=1;j<=100;j++){
if(i*100+j<=n){
scanf("%d",&a[i][j]);
c=a[i][j]/100;
d=a[i][j]%100;
b[c][d]++;
}
else{
i=100;j=101;}
}
for(i=0;i<100; i++)
for(j=1;j<=100;j++){
if(b[i][j]!= 0){
count++;
l=i*100+j;
}
if(count == k){
i=100;j=101;}
}
if(count == k&&k<=400)
printf("%d\n",l);
else
printf("NO RESULT\n");
}
为什么运行错误 展开
第1行为n和k,第2行开始为n个正整数的值,整数间用空格隔开。
输出
第k个最小整数的值;若无解,则输出“NO RESULT”。
#include<stdio.h>
int main(void){
int a[101][101];
int b[101][101] = {0};
int n,k;
int i,j,l,c,d;
int count = 0;
scanf("%d%d",&n,&k);
for(i=0;i<100; i++)
for(j=1;j<=100;j++){
if(i*100+j<=n){
scanf("%d",&a[i][j]);
c=a[i][j]/100;
d=a[i][j]%100;
b[c][d]++;
}
else{
i=100;j=101;}
}
for(i=0;i<100; i++)
for(j=1;j<=100;j++){
if(b[i][j]!= 0){
count++;
l=i*100+j;
}
if(count == k){
i=100;j=101;}
}
if(count == k&&k<=400)
printf("%d\n",l);
else
printf("NO RESULT\n");
}
为什么运行错误 展开
展开全部
题目只说 n≤100000和k≤400。
但是并没有限定输入整数的规模
这样
c=a[i][j]/100;
d=a[i][j]%100;
b[c][d]++;
这几行代码中 c就有可能是超过100的 比如输入的是100000
这样c=1000
明显 b[c][d]就越界了。
其实没那么复杂。
只需要对每个输入的 进行插入排序,同时只保留前k个就好。
开一个400的数组。
最后a[k-1]就是结果。
但是并没有限定输入整数的规模
这样
c=a[i][j]/100;
d=a[i][j]%100;
b[c][d]++;
这几行代码中 c就有可能是超过100的 比如输入的是100000
这样c=1000
明显 b[c][d]就越界了。
其实没那么复杂。
只需要对每个输入的 进行插入排序,同时只保留前k个就好。
开一个400的数组。
最后a[k-1]就是结果。
更多追问追答
追问
谢谢你的建议,可我设成a[101][1001],为什么答案错误了
追答
算法本身就错了 出什么结果 都正常。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
开一个int a[100000]的并初始化为0,依次输入i-N,把对应的a[i]改为1
然后从a[0]开始数为1的数,第K个就是第几个数为1的数,把i输出来
复杂度依次输入为N,一次循环N
N+N=N的复杂度
然后从a[0]开始数为1的数,第K个就是第几个数为1的数,把i输出来
复杂度依次输入为N,一次循环N
N+N=N的复杂度
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询