一、编程题(共4题,共100分)
1. 小白兔拔萝卜
小白兔拔萝卜,但是它的力量有限,太大的萝卜它拔不动。于是它叫来了一群小伙伴……
本题就请你根据小白兔们的力量和拔出这个萝卜需要的力量,告诉小白兔,它最少需要哪些伙伴能拔出这只大萝卜。
时间限制:7000
内存限制:65536
输入
输入在第一行里给出两个不超过 1000 的正整数 n 和 T,分别是小白兔的数量和拔出这个萝卜需要的力量。随后一行给出 n 个不超过 100 的正整数,其中第 i 个数对应编号为 i 的小白兔的力量(i=1, … , n)。
输出
如果兔子们有可能拔成功,则首先在第一行输出最少需要多少只兔子才能拔出这只萝卜,然后第二行从小到大输出参与拔萝卜的兔子们的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。 如果所有兔子合力都不能拔出萝卜,则首先在第一行输出 `0`,随后在第二行中输出:`Suan4 le ba, hai2 cha4 X.` 其中 `X` 是小白兔们缺少的力量值。注意:力量等于 T 是可以拔出萝卜的。 解可能不是唯一的,你只要随便输出一组就可以。
样例输入
样例1:
10 100
3 25 4 91 13 81 64 38 49 51
样例2:
5 50
3 2 8 5 10
样例输出
样例1:
2
2 4
样例2:
0
Suan4 le ba, hai2 cha4 22.
试题编号:20241207-5-01
试题类型:编程题
标准答案:
试题难度:一般
试题解析:
展示地址:点击浏览
考生答案:(此题已作答)
考生得分:0
是否评分:已评分
评价描述:
代码;#include<bits/stdc++.h>
using namespace std;
int main(){
int n,T,temp,sum=0;
cin>>n>>T;
int ans[n+1][2];
map<int,int> r2;
map<int,int>::reverse_iterator it;
for(int i=1;i<=n;i++){
cin>>temp;
r2[temp]=i;
}
for(it=r2.rbegin();it!=r2.rend();it++){
if(sum>T){
break;
}
sum+=it->first;
}
it--;
cout<<it->second<<"->"<<it->first;
/*int i;
for(i=1;i<=n;i++){
if(sum>=T){
break;
}
sum+=ans[i][0];
}
i--;
/*int ans1[i+1][2];
for(int j=1;j<=i;j++){
printf("编号:%d->力量:%d\n",ans[j][1],ans[j][0]);
ans1[j][0]=ans[j][0];
ans1[j][1]=ans[j][1];
}
for(int k=1;k<=n;k++){
for(int j=1;j<=i-k;j++){
if(ans1[j][0]<ans1[j+1][0]){
temp=ans[j][0];
ans1[j][0]=ans1[j+1][0];
ans1[j+1][0]=temp;
swap(ans1[j][1],ans1[j+1][1]);
}
}
}
cout<<i<<endl;
for(int j=1;j<=i;j++){
cout<<ans1[j][1]<<" ";
}*/
/*return 0;
}
或
#include<bits/stdc++.h>
using namespace std;
bool mySort1(pair<int,int>&a,pair<int,int>&b){
return a.first>b.first;
}
int main()
{
/*vector<int>v1;
srand(time(0));
for(int i=1;i<=100;i++){
v1.push_back(rand()%(101) + 100);
}
for(int i=1;i<v1.size();i++){
cout<<v1[i]<<" ";
}*/
/*pair<int,int>p1;
p1={1,2};
cout<<p1.first<<"->"<<p1.second;*/
/* int n,T,temp,sum=0;
vector<pair<int,int>>rabbits;
set<int>bh;//保存满足力量的编号
cin>>n>>T;
for(int i=1;i<=n;i++){
cin>>temp;
rabbits.push_back({temp,i}) ;
}
sort(rabbits.begin(),rabbits.end(),mySort1);
for(int i=0;i<n;i++){
cout<<rabbits[i].first<<"->"<<rabbits[i].second<<endl;
}
//贪心便利每次取最大值
temp=0;
for(int i=0;i<n;i++){
if(sum>=T){
break;
}
sum=sum+rabbits[i].first;
bh.insert(rabbits[i].second);
temp++;
}
if(sum<T){
cout<<0<<endl;
cout<<"Suan4 le ba,hai2 cha4 X.";
}
else{
cout<<temp<<endl;
for(set<int>::iterator it=bh.begin();it!=bh.end();it++){
cout<<*it<<" ";
}
}
return 0;
}