这道题总体来看还是比较满意的。连想带打不超过半个小时,打了不到当时基本读懂后就感觉是贪心,但贪什么很重要,当时一开始想的是贪心死亡人数,从小到大搞,然后自己造了几个小数据,还好WA了,然后又列了一个式子,直接证明了贪心。式子如下:
我们设有两个据点,一个A=x1,B=y1,另一个A=x2,b=y2。
若x1-y1>x2-y2
则先打A所需为 x1+(x2-(x1-y1))=x2+y1,先打B为x2+(x1-(x2-y2))=x1+y2。
由上式可知x1+y2>x2+y1,所以应当先打A。
其余同理。
然后我们只要sort一遍打一个模拟就好了。
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstdio> 4 #include<cstring> 5 #include<queue> 6 #include<algorithm> 7 #include<cmath> 8 #include<map> 9 #define N 100005 10 using namespace std; 11 int n,t; 12 struct no 13 { 14 long long a,b,c; 15 }node[N]; 16 int px(no a,no b) 17 { 18 return a.c>b.c; 19 } 20 long long now,sum; 21 int main() 22 { 23 scanf("%d",&t); 24 while(t--) 25 { 26 scanf("%d",&n); 27 for(int i=1;i<=n;i++) 28 { 29 scanf("%lld%lld",&node[i].a,&node[i].b); 30 node[i].c=node[i].b-node[i].a; 31 } 32 sort(node+1,node+n+1,px); 33 now=sum=0; 34 for(int i=1;i<=n;i++) 35 { 36 if(now<node[i].b) 37 { 38 sum+=node[i].b-now; 39 now=node[i].b; 40 } 41 now-=node[i].a; 42 } 43 printf("%lld\n",sum); 44 } 45 return 0; 46 }
时间: 2024-10-11 12:28:20