6 条题解
-
17
很简单:
#include<bits/stdc++.h> #define int long long using namespace std; int n; struct node { int val,id; }a[100001]; bool cmp(node x,node y) { if(x.val==y.val)return x.id<y.id; return x.val<y.val; } signed main() { cin>>n; for(int i=1;i<=n;i++)cin>>a[i].val,a[i].id=i; sort(a+1,a+1+n,cmp); double sum=0; for(int i=1;i<=n;i++) { cout<<a[i].id<<' '; } for(int i=n;i>=1;i--) { sum+=(n-i)*a[i].val; } printf("\n%0.2f",sum/n); return 0; }
-
3
贪心快速得出结果//已AC
#include <bits/stdc++.h> using namespace std; long long n,t[1005],a[1005],ans; double sum; int main(){ cin >> n; for(int i=1;i<=n;i++){ cin>>t[i]; a[i]=t[i]; } sort(t+1,t+n+1);//排序 for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(t[i]==a[j]){ cout<<j<<" "; a[j]=0; break; } } }//对应 cout<<endl; for(int i=1;i<n;i++){ ans+=t[i]; sum+=ans; } cout<<fixed<<setprecision(2)<<sum/n; return 0; }
-
2
关键看在sort的稳定性。
#include <bits/stdc++.h> struct T{ int val,p; }t[1001]; bool cmp(T a,T b){ return a.val==b.val?a.p<b.p:a.val<b.val; //增加sort的稳定性,排序 } int main(void){ int n; double sum=0; std::cin>>n; for(int i=1;i<=n;i++){ std::cin>>t[i].val; t[i].p=i; } std::sort(t+1,t+n+1,cmp); //排序 for(int i=1;i<=n;i++){ std::cout<<t[i].p<<' '; sum+=t[i].val*(n-i); //累加 } printf("\n%.2lf",sum/n); //printf简单 return 0; }
-
2
这道题目要求找出 n 个人排队接水的一种顺序,使得 n 个人的平均等待时间最小。我们需要根据每个人的等待时间,进行排序并计算平均等待时间。以下是具体实现的步骤:
- 首先,读取输入的整数 n。
- 接下来,读取 n 个整数,表示每个人的等待时间 ti,将这些等待时间存储到一个数组中。
- 创建一个结构体paidui,用于保存每个人的等待时间和原始序号。
- 定义自定义的比较函数cmp,按照等待时间升序排序,等待时间相同按照原始序号升序排序。
- 使用sort函数对每个人进行排序。
- 创建一个变量sum来保存总等待时间,初始值为0。
- 使用循环遍历排序后的数组,计算每个人的等待时间,将等待时间累加到sum中。
- 计算平均等待时间average_time,即sum除以n。
- 输出排序后的顺序,即每个人的原始序号。
- 输出平均等待时间average_time,保留两位小数。
#include<iostream> #include<iomanip> #include<algorithm> #define MAXN 1005 using namespace std; struct paidui{ int value; // 每个人的等待时间 int p; // 每个人的原始序号 }; paidui a[MAXN]; // 自定义比较函数,按照等待时间升序排序,等待时间相同按照原始序号升序排序 bool cmp(const paidui &a, const paidui &b) { if (a.value == b.value) { return a.p < b.p; } else { return a.value < b.value; } } int main() { int n; cin >> n; // 读取每个人的等待时间 for (int i = 1; i <= n; ++i) { cin >> a[i].value; a[i].p = i; // 初始化每个人的原始序号 } // 对每个人进行排序 sort(a+1, a+1+n, cmp); double sum = 0; // 累加等待时间的总和 for (int i = 1; i <= n; ++i) { cout << a[i].p << " "; // 输出每个人的原始序号 sum += (n-i) * a[i].value; // 计算等待时间的总和,因为按照升序排列,所以后面的人都要等前面的人 } cout << endl; // 输出平均等待时间 cout << fixed << setprecision(2) << sum / n << endl; // 输出结果保留两位小数 return 0; }
记得点赞!!!记得点赞!!!记得点赞!!!
-
1
#include <bits/stdc++.h> using namespace std; long long n,t[1005],a[1005],ans; double sum; int main(){ cin >> n; for(int i=1;i<=n;i++){ cin>>t[i]; a[i]=t[i]; } sort(t+1,t+n+1);//排序 for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(t[i]==a[j]){ cout<<j<<" "; a[j]=0; break; } } }//对应 cout<<endl; for(int i=1;i<n;i++){ ans+=t[i]; sum+=ans; } cout<<fixed<<setprecision(2)<<sum/n; return 0; }
已优化
- 借鉴
- 1
信息
- ID
- 259
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- (无)
- 递交数
- 998
- 已通过
- 418
- 上传者