Xiongnu's Land
阿新 • • 發佈:2018-11-10
題意:有一個矩形的地方左下角座標(0,0),右上角座標(R,R),裡面有N個綠洲,每個綠洲給出左下角座標(L,T)寬W高H,把這塊地以x=n(整數)分成兩部分需要滿足兩個要求
1.左邊與右邊的綠洲面積差最小。
2.在滿足1的條件下,讓左邊的面積儘量大
輸出分割的座標n
思路:把矩形分成寬為1的單位矩形,算出每個矩形的綠洲面積,從左邊找到左邊面積大於等於總面積一半的位置 再向後找,如果面積不變化,座標向後移,直到面積變化停止
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<algorithm> #include<queue> #include<math.h> #include <stack> using namespace std; #define ll long long #define INF 0x3f3f3f3f #define met(a,b) memset(a,b,sizeof(a)) #define mod 2147493647 #define N 1000010 ll sum[N]; int main() { int t,x,y; ll l,w; scanf("%d",&t); int r,n; while(t--) { scanf("%d",&r); scanf("%d",&n); ll S=0; met(sum,0); for(int i=0; i<n; i++) { scanf("%d %d %lld %lld",&x,&y,&w,&l); S+=w*l;///求總面積 for(int j=x; j<=x+w-1 && j<=r-1 ;j++) { sum[j]+=l;///記錄每個單位的面積變化 } } ll ans=0; int i,j; for(i=0; i<r; i++) { ans+=sum[i]; if(ans*2 >= S)///找到一個剛好大於或等於s的地方,如果不能平分,多的一份給左邊 break; } ll ans1=ans; for(j=i+1;j<r;j++) { ans1+=sum[j]; if(ans1!=ans)///如果往後面積綠洲面積沒變,西邊擁有的面積可以增加 break; } printf("%d\n",j); } return 0; }