DiV1
300:给一组士兵再给一组战马都有权值。
安排战马的顺序的方案数,是第一个士兵和其战马的权值乘积最大。
做法:随便暴力就好。
枚举战马和第一个士兵匹配。其他士兵按权值从大到小排序,战马权值按从小到大排序。1.
举个例子:士兵,A,B,C,D,E
战马,a,b,c,d,e
第一个士兵和其战马的乘积是:tmp
A 可以A*c<tmp;
B 可以 B*d<tmp;
B 与战马的乘积小于tmp,其战马的权值一定大于等于c,因为 1.
所以答案就是ans = (c-第几个士兵+1)*(d-第几个士兵+1)...
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 typedef long long ll; 5 6 #define mod 1000000007 7 8 int a[12345],b[12345]; 9 10 class BearCavalry { 11 public: 12 int countAssignments(vector <int> warriors, vector <int> horses) { 13 int n=warriors.size(); 14 for (int i=0;i<n;i++) 15 a[i]=warriors[i]; 16 sort(a+1,a+n); 17 reverse(a+1,a+n); 18 19 ll ans=0; 20 21 for (int i=0;i<n;i++) 22 { 23 int t=0; 24 for (int j=0;j<n;j++) 25 if (i!=j) b[t++]=horses[j]; 26 sort(b,b+t); 27 28 int tmp=a[0]*horses[i]; 29 30 31 ll num=1; 32 for (int i=1;i<n;i++){ 33 int x=-1; 34 for (int j=0;j<t;j++) 35 { 36 if (a[i]*b[j]<tmp) 37 { 38 x=j; 39 } 40 else break; 41 } 42 //if (x==-1&&i>1) x=0; 43 int xx=x+1-(i-1); 44 if (xx<0) xx=0; 45 num=num*xx%mod; 46 } 47 ans=(ans+num)%mod; 48 // cout<<num<<endl; 49 50 } 51 return ans; 52 } 53 }; 54 55 56 int main() 57 { 58 BearCavalry p; 59 int n; 60 cin>>n; 61 vector<int>aa,ba; 62 for (int i=1;i<=n;i++) 63 { 64 int x; 65 cin>>x; 66 aa.push_back(x); 67 } 68 for (int i=1;i<=n;i++) 69 { 70 int x; 71 cin>>x; 72 ba.push_back(x); 73 } 74 75 cout<<p.countAssignments(aa,ba); 76 return 0; 77 }
时间: 2024-10-18 09:14:03