B:
思想很简单,就是读入一个字符串之后分成一个数列,然后再排序
可以从后往前把字符串给分割开(当然也可以从前往后)
先设个k和i,k表示在数字数组里数字存到第k个,i表示现在在第几个字符
分割时注意判定连续的‘5’(否则数组中可能会出现多余的0)以及在字符串末的‘5’,从后往前分割可以不用判定字符串首的‘5’,因为我们要让数字数组的下标从0开始到k-1而不是k,到字符串首无论是不是‘5’k都要++,当然从1到k也是可以的
至于把字符转化成数字就不用强调了吧……
最好每次数据输入完都把数组清空一下(注意是多组数据)
下面附上AC代码:
#include<bits/stdc++.h>
using namespace std;
char C[1010];
int A[1010];
int main(){
while(scanf("%s",&C)!=EOF){
int l=strlen(C),k=0,v=1;
memset(A,0,sizeof(A));
for(int i=l-1;i>=0;i--){
if(C[i]=='5'&&i!=l-1&&C[i+1]!='5'){
v=1;k++;continue;
}else if(C[i]=='5'&&(i==l-1 or C[i+1]=='5')){
v=1;continue;
}else if(C[i]!='5'&&i==0){
A[k]=A[k]+v*(C[i]-'0');v=1;k++;continue;
}
A[k]=A[k]+v*(C[i]-'0');
v=v*10;
}
sort(A,A+k);
for(int i=0;i<k;i++){
if(i<k-1)printf("%d ",A[i]);
else if(i==k-1)printf("%d\n",A[i]);
}
}
return 0;
}
//这是我的做法,有别的做法也可以尝试,排序可以用sort也可以自己敲
H:插入和排序
这道题提示直接给你个get()函数来输入,如果不用这个用scanf的话会超时(我试过)
所以函数是肯定要抄上的
而且要注意数组大小:n是小于等于30000000的,稍微再开大点(想我就是少打了个0才WA好多次的qwq)
如果你的数组下标是0~n-1,那么k位置的数是A[k-1]
下标是1~n那就是A[k]了
别的就没了
下面附上AC代码:
#include<bits/stdc++.h>
using namespace std;
int get(){
int r=0;
char c;
while(c=getchar(),!(c>='0'&&c<='9'));
r=c-'0';
while(c=getchar(),c>='0'&&c<='9')
r=(r*10)+c-'0';
return r;
}
int A[30000100];
int n;
int main(){
n=get();
for(int i=0;i<n;i++){
A[i]=get();
}
sort(A,A+n);
int m,k;m=get();
for(int i=0;i<m;i++){
k=get();
printf("%d\n",A[k-1]);
}
return 0;
}