1. 程式人生 > 實用技巧 >最短路徑問題——分支限界法

最短路徑問題——分支限界法

A. Cancel the Trains

題意:給定兩個陣列,找出這兩個陣列中有多少重複元素,然後輸出

思路:直接找

程式碼:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<cstring>
 6 #include<map>
 7 #include<queue>
 8 using namespace std;
 9 const int maxx=2e5+10;//14.12
10 int main(){ 11 int n; 12 scanf("%d",&n); 13 while(n--){ 14 int a[150]={0}; 15 int b[150]={0}; 16 int m,k; 17 scanf("%d %d",&m,&k); 18 for(int i=0;i<m;i++){ 19 int num; 20 scanf("%d",&num); 21 a[num]++;
22 } 23 for(int j=0;j<k;j++){ 24 int num; 25 scanf("%d",&num); 26 b[num]++; 27 } 28 int sum=0; 29 for(int i=0;i<150;i++){ 30 if(a[i]>0&&b[i]>0){ 31 sum++; 32 } 33 }
34 printf("%d\n",sum); 35 } 36 }
View Code

B. Suffix Operations

題目及解題見:一道codeforces題引發的差分學習

C. Triangles(思維題)

題意:題目中已知矩陣及其矩陣上的數字(從0-9),問最大面積的三角形:1.0-9各個數字分別構成的最大的三角形,保證頂點上是其對應的數字;2.可以替換掉矩陣中任意一個數字,把它變成任意一個數字;3.保證三角形的一個邊和是水平的或者豎直的,輸出各個數構成三角形的最大面積值

思路:構造,讓其一個點是定住的,找到此數能到達的最大位置x和最小的位置x(縱座標不一定相等)然後豎直方向直接改變進行變換,讓其成為被改變的那個數,這樣就和豎直方向平行了。水平方向的計算也是如此

程式碼:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<map>
 7 using namespace std;
 8 //const int maxxx=1e5+10;
 9 int maxx[20]={0},maxy[20]={0},minx[20],miny[20],c[50]={0};
10 int ans[50]={0},p[2500][2500];
11 int main(){
12     int t;
13     scanf("%d",&t);
14     while(t--){
15         int n;
16         scanf("%d",&n);
17 
18         for(int i=0;i<10;i++){
19             minx[i]=n+1;
20             miny[i]=n+1;
21             maxx[i]=0;
22             maxy[i]=0;
23             c[i]=0;
24             ans[i]=0;
25         }
26         for(int i=1;i<=n;i++){
27             for(int j=1;j<=n;j++){
28                 scanf("%1d",&p[i][j]);
29                 int xx=p[i][j];
30                 c[xx]++;
31                 maxx[xx]=max(maxx[xx],i);
32                 maxy[xx]=max(maxy[xx],j);
33                 minx[xx]=min(minx[xx],i);
34                 miny[xx]=min(miny[xx],j);
35             }
36         }
37         for(int i=1;i<=n;i++){
38             for(int j=1;j<=n;j++){
39                 int xx;
40                 xx=p[i][j];
41                 if(c[xx]<2){
42                     continue;
43                 }
44                 int dx=max(i-minx[xx],maxx[xx]-i);
45                 int dy=max(j-miny[xx],maxy[xx]-j);
46                 ans[xx]=max(ans[xx],dx*(max(j-1,n-j)));
47                 ans[xx]=max(ans[xx],dy*(max(i-1,n-i)));
48             }
49         }
50         for(int i=0;i<10;i++){
51             printf("%d",ans[i]);
52             if(i<9){
53                 printf(" ");
54             }
55         }
56 
57         printf("\n");
58     }
59 }
View Code