您好,登錄后才能下訂單哦!
/* 本算法的缺點 在于開的空間太大 分三類情況 線段 (-10,-1)在負區間 (-10,10)雙區間 (1,10)正區間 一下給出正區間的代碼,已考慮小數 思路是 絕對正區間,覆蓋到數軸 sz[]數組上 小數部分 用sum1 累計 */ #include <bits/stdc++.h> using namespace std; #define max 1000 //數軸長度 int sz[max]; #define n 10 //測試線段條數 坐標入下(a[],b[]) /* 0 1 2 3 4 5 6 double a[2*n]={1,3,5,7,9,11,13,15,17,19}; double b[2*n]={2,4,6,8,10,12,14,16,18,20}; */ double a[2*n]; double b[2*n]; int add=n;//添加的線段下標 double funadd(int s,int t) { for(int i=s;i<=t;i++) { sz[i]=1; } } double fun() //數軸上置1 小數部分 用sum1 累計 sum2為整數部分求和 { double sum=0;double sum1=0;double sum2=0; int s=0; int t=0; for(int i=0;i<2*n;i++) { if(a[i]==b[i])continue;//未處理部分為 0 就好了 不知道 初始化; if(a[i]>b[i])swap(a[i],b[i]); if(a[i]<0&&b[i]<0){tmp=-a[i];a[i]=-b[i];b[i]=tmp;}//均為負數的處理方法 if(a[i]<0&&b[i]>0){a[add]=0;b[add]=-a[i];add++;a[i]=0;}//雙區間的截斷處理方法 產生新的區間 放到未處理的數組對中 s=ceil(a[i]);t=floor(b[i]); sum1+=s-a[i];sum1+=b[i]-t; funadd(a[i],b[i]); } for(int i=0;i<2*max;i++) { if(sz[i]==1)sum2+=1; } sum=sum1+sum2; return sum; } //負數的處理 轉正 (-5,-1)-->(1,5) //(-10,10)這種 分為2部分 int main() { for(int i=0;i<n;i++) { a[i]=2*i+1;b[i]=2*i+2; } for(int i=n;i<2*n;i++) { a[i]=b[i]=0; } cout<<fun()<<endl; cout << "Hello,C++ world of AnycodeX!" << endl; return 0; }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。