最短路徑問題——分支限界法
阿新 • • 發佈:2020-12-06
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.12View Code10 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 }
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