6 条题解

  • 17
    @ 2023-9-8 22:48:20

    很简单:

    #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;
    }
    
    • @ 2023-10-6 20:00:24

      同志,我看了你的个人主页,看完我只说了两个字:牛叉!

      同学们!!!一定要看看周子翔(一个蒟蒻) (hetao2753405) 的个人主页!!!!!太牛了!

    • @ 2023-11-4 16:36:17

      没设么能说的,只能说nice,wonduful,beautiful,funny(此处省略一百个adj褒义单词)


      玉树临风,英俊潇洒,风流倜傥,人见人爱,花见花开,肯定从小缺钙,长大缺爱,姥姥不疼,舅舅不爱。


      人见人爱,花见花开,🚗见车爆胎,┏┛墓┗┓...(((m -__-)m见鬼投胎,🐒见佛发呆,🐕见狗摆尾,猪见🐖拱嘴,车见车载,⚰见到打开盖,飞--(˙<>˙)/--落地, 巧煮排骨 。

    • @ 2024-2-23 18:05:58

      @ 绝了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  • 3
    @ 2023-7-27 21:48:37

    贪心快速得出结果//已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
      @ 2023-7-28 10:12:02

      关键看在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
        @ 2023-7-27 19:35:01

        这道题目要求找出 n 个人排队接水的一种顺序,使得 n 个人的平均等待时间最小。我们需要根据每个人的等待时间,进行排序并计算平均等待时间。以下是具体实现的步骤:

        1. 首先,读取输入的整数 n。
        2. 接下来,读取 n 个整数,表示每个人的等待时间 ti,将这些等待时间存储到一个数组中。
        3. 创建一个结构体paidui,用于保存每个人的等待时间和原始序号。
        4. 定义自定义的比较函数cmp,按照等待时间升序排序,等待时间相同按照原始序号升序排序。
        5. 使用sort函数对每个人进行排序。
        6. 创建一个变量sum来保存总等待时间,初始值为0。
        7. 使用循环遍历排序后的数组,计算每个人的等待时间,将等待时间累加到sum中。
        8. 计算平均等待时间average_time,即sum除以n。
        9. 输出排序后的顺序,即每个人的原始序号。
        10. 输出平均等待时间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;
        }
        

        记得点赞!!!记得点赞!!!记得点赞!!!

        • 2
          @ 2023-7-6 16:27:31

          本题因为需要输出排队顺序,所以需要注意sort的稳定性,更改sort比较规则可以保证排序稳定性,关键代码可以参考 注意:第一问如果有两个接水时间相同的人,那么就按照原本的顺序,cmp编法如下

          bool cmp(T z,T y)
          {
          	if(z.a==y.a)
          	{
          		return z.b<y.b;
          	}
          	return z.a<y.a;
          }
          
          • 1
            @ 2023-7-28 16:02:57
            #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
            上传者