3 条题解

  • 2
    @ 2023-7-12 19:11:57
    #include <iostream>
    #include <algorithm>
    using namespace std;
    long long n , m , b[200005] , bi , c[200005] , ci , j;
    int main(){
    	cin >> n ;
    	for(int i = 0 ; i < n ; i ++) 
    		cin >> b[i];//输入禾木时间
    	for(int i = 0 ; i < n ; i ++){
    		cin >> c[i];//输入桃子时间
    		if(b[i] > c[i])
            //因为bi , ci 在循环时永远不会大于i,且后续不用双方时间,
            //所以可以直接覆盖原数组
    			b[bi++] = b[i] - c[i];//桃子用时小于禾木的题
    		else
    			c[ci++] = c[i] - b[i];//桃子用时大于禾木的题
    	}
    	m += bi*(bi-1)/2;//两道用时小的加起来一定小,所以直接加上任意两题的组合数
    	sort(c,c+ci);//排序,数组c按从小到大
    	sort(b,b+bi);//同上
    	n = 0;//后续不需要n,直接覆盖
    	for(int i = 0 ; i < bi ; i ++){
    		m += n ;
            //因为排过序,所以当c[i] < b[j] 时, c[i] < b[j+1]
            //所以n表示循环前有多少题不用判断直接可以加上
    		for(1; j < ci ; j ++){//j不用重置,因为c[0]~c[j]必定成立
    			if(b[i] - c[j] > 0)
                //判断,若此时成立,b[j]及以后都成立,下次可以不用判断,直接n ++ 即可
    				m ++ , n ++ ;
    			else
    				break ;
                //否则不成立,接下来更不可能成立,直接跳出
    		}
    	}
    	cout << m ;
    	return 0 ;
    }
    
    • 0
      @ 2022-7-19 19:23:49

      最基础的方法暴力枚举,但只有50分

      #include <iostream>
      using namespace std;
      int n , a[200005][2] , m;
      int main(){
      	cin >> n ;
      	for(int i = 0 ; i < n ; i ++) 
      		cin >> a[i][0];//输入禾木时间
      	for(int i = 0 ; i < n ; i ++) 
      		cin >> a[i][1];//输入桃子时间
      	for(int i = 0 ; i < n ; i ++)
      		for(int j = 0 ; j < i ; j ++)//双循环,暴力枚举两题
      			m += (a[i][0]+a[j][0] > a[i][1]+a[j][1]) ;
                  //若禾木总时间大于桃子,成立
      	cout << m ;//输出
      	return 0 ;//真的太简单了!(就是没分)
      }
      

      优化亿点点后:

      #include <iostream>
      #include <algorithm>
      using namespace std;
      long long n , m , b[200005] , bi , c[200005] , ci , j;
      int main(){
      	cin >> n ;
      	for(int i = 0 ; i < n ; i ++) 
      		cin >> b[i];//输入禾木时间
      	for(int i = 0 ; i < n ; i ++){
      		cin >> c[i];//输入桃子时间
      		if(b[i] > c[i])
              //因为bi , ci 在循环时永远不会大于i,且后续不用双方时间,
              //所以可以直接覆盖原数组
      			b[bi++] = b[i] - c[i];//桃子用时小于禾木的题
      		else
      			c[ci++] = c[i] - b[i];//桃子用时大于禾木的题
      	}
      	m += bi*(bi-1)/2;//两道用时小的加起来一定小,所以直接加上任意两题的组合数
      	sort(c,c+ci);//排序,数组c按从小到大
      	sort(b,b+bi);//同上
      	n = 0;//后续不需要n,直接覆盖
      	for(int i = 0 ; i < bi ; i ++){
      		m += n ;
              //因为排过序,所以当c[i] < b[j] 时, c[i] < b[j+1]
              //所以n表示循环前有多少题不用判断直接可以加上
      		for(1; j < ci ; j ++){//j不用重置,因为c[0]~c[j]必定成立
      			if(b[i] - c[j] > 0)
                  //判断,若此时成立,b[j]及以后都成立,下次可以不用判断,直接n ++ 即可
      				m ++ , n ++ ;
      			else
      				break ;
                  //否则不成立,接下来更不可能成立,直接跳出
      		}
      	}
      	cout << m ;
      	return 0 ;
      }
      
      • -7
        @ 2022-4-24 16:45:34

        写题解请注意

        鼓励大家写题解,但注意题解格式。

        题解一定要有思路解析或代码注释,能否让别人理解你的思路

        也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。

        给代码两端加上这个会舒服一些

        ```cpp

        你的代码

        ```

        </span>

        这个点在键盘的左上角tab上面那个键,注意切换输入法

        #include<iostream>
        using namespace std;
        int main()
        {
            int n;
            cin>>n;//这是一个注释
            return 0;
        } 
        

        请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

        抄袭题解一经发现直接取消成绩。

        题解被删除的可能

        1. 代码不符合格式规范
        2. 没有思路讲解或者没有注释,
        3. 无意义的题解

        大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。

        • 1

        信息

        ID
        1239
        时间
        1000ms
        内存
        256MiB
        难度
        6
        标签
        递交数
        395
        已通过
        113
        上传者