1. 程式人生 > >9.16考試 第一題 X國的軍隊題解

9.16考試 第一題 X國的軍隊題解

class while 死亡人數 names scanf math src gif 技術

技術分享

技術分享

技術分享

  這道題總體來看還是比較滿意的。連想帶打不超過半個小時,打了不到當時基本讀懂後就感覺是貪心,但貪什麽很重要,當時一開始想的是貪心死亡人數,從小到大搞,然後自己造了幾個小數據,還好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 }
View Code

9.16考試 第一題 X國的軍隊題解