zoukankan      html  css  js  c++  java
  • equation

    equation

    枚举分段函数

    在每个区间段内求解

    切记:cmp函数里面不能有=号

      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 typedef long long ll;
      4 #define P pair<ll,ll>
      5 P A[100005];
      6 P B[300005];
      7 bool cmp(P a,P b)
      8 {
      9     //if((ll)a.first*b.second==(ll)a.second*b.first)cout<<"NO"<<endl;
     10     return (ll)a.first*b.second<(ll)a.second*b.first;
     11 
     12 }
     13 bool equ(P a,P b)
     14 {
     15     if(a.first==b.first&&a.second==b.second)return true;
     16     return false;
     17 }
     18 int main()
     19 {
     20     ll T;
     21     ll N,C,t,cnt;
     22     P o;
     23     freopen("1.in","r",stdin);
     24     scanf("%lld",&T);
     25     while(T--)
     26     {
     27         cnt=0;
     28         scanf("%lld%lld",&N,&C);
     29         for(int i=0; i<N; i++)
     30         {
     31             scanf("%lld%lld",&A[i].second,&A[i].first);
     32             A[i].first*=-1;
     33         }
     34         sort(A,A+N,cmp);
     35         ll a=0,b=0,c,d;
     36 
     37         bool f=0;
     38         for(int i=0; i<N; i++)
     39         {
     40             b+=A[i].first;
     41             a-=A[i].second;
     42         }
     43         for(int i=0; i<=N; i++)
     44         {
     45             if(i==0);
     46             else
     47             {
     48                 b-=2*A[i-1].first;
     49                 a+=2*A[i-1].second;
     50             }
     51 
     52             if(a==0)
     53             {
     54                 if(b==C)
     55                 {
     56                     puts("-1");
     57                     f=1;
     58                     break;
     59                 }
     60                 else continue;
     61             }
     62             else
     63             {
     64 
     65                 c=C-b;
     66 
     67                 t=__gcd(abs(a),abs(c));
     68                 d=a;
     69                 d/=t;
     70                 c/=t;
     71                 o.first=c;
     72                 o.second=d;
     73                 if(o.second<0)o.second*=-1,o.first*=-1;
     74                 if(((i==0||cmp(A[i-1],o))&&(cmp(o,A[i])||i==N))||equ(A[i],o))
     75                 {
     76                     if(B[cnt-1].first!=o.first||B[cnt-1].second!=o.second){
     77                         B[cnt]=o;
     78                         cnt++;
     79                     }
     80                 }
     81             }
     82 
     83         }
     84         if(f)continue;
     85         else
     86         {
     87             if(cnt==0){
     88                 cout<<cnt<<'
    ';
     89                 continue;
     90             }
     91             cout<<cnt<<' ';
     92             for(int i=0; i<cnt-1; i++)
     93             {
     94                 cout<<B[i].first<<'/'<<B[i].second<<' ';
     95             }
     96             cout<<B[cnt-1].first<<'/'<<B[cnt-1].second;
     97             cout<<'
    ';
     98         }
     99     }
    100 
    101 }
  • 相关阅读:
    Http与WWW服务精解
    Http与WWW服务精解
    6-13
    好用的工具说明
    JVM、JRE和JDK三者间的区别和联系
    css进阶之二:flex弹性布局
    MVVM
    如何理解TCP的三次握手协议?
    java里面的设计模式
    linux常用命令
  • 原文地址:https://www.cnblogs.com/liulex/p/11306025.html
Copyright © 2011-2022 走看看