A题直接暴力水过
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 #define int long long 5 #define N 6666666 6 int arr[N]; 7 8 signed main(){ 9 int _;cin>>_; 10 while(_--){ 11 int n,m; 12 cin>>n>>m; 13 if(n>=m){ 14 cout<<"YES"<<' '; 15 continue; 16 } 17 int f=0; 18 for(int i=1;i<n;i++){ 19 int t=m/(i+1); 20 if(m%(i+1)) t++; 21 if(i+t<=n){ 22 f=1; 23 break; 24 } 25 } 26 if(f){ 27 cout<<"YES"<<' '; 28 }else{ 29 cout<<"NO"<<' '; 30 } 31 } 32 return 0; 33 }
暴力打了个表看出的规律。
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 #define int long long 5 #define N 6666666 6 int arr[N]; 7 8 signed main(){ 9 int _;cin>>_; 10 while(_--){ 11 int a,b; 12 cin>>a>>b; 13 if(b<9){ 14 cout<<"0"<<' '; 15 continue; 16 } 17 int s=0;int cnt=0; 18 for(int i=0;;i++){ 19 s=s*10+9; 20 21 if(s>b){ 22 23 break; 24 }cnt++; 25 26 } 27 cout<<cnt*a<<' '; 28 } 29 return 0; 30 }
不会DPQAQ
-
题意:用n个数字(1~n),构造两个长度为m的序列满足以下条件:
- ai≤bi(1≤i≤m)
- a序列不递减
- b序列不递增
问有多少种方案?
- ai≤bi(1≤i≤m)
-
分析:
- 根据a不递减,b不递增,且ai≤bi(1≤i≤m)ai≤bi(1≤i≤m) 的条件,我们可以得出如果将b序列反向加在a序列后面构成新的序列,这个序列一定是非递减的。所以问题转为2*m的序列,用n个数构成非递减序列的方案数。DP。
- dp[i][j]表示第 i 个位置放 j 数的方案数,显然它等于前面 i - 1 位放 k (k≤j) 的方案数之和
-
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 #define int long long 5 #define mod 1000000007 6 int dp[2000][2000];// 7 //dp[i][j]表示第 i 个位置放 j 数的方案数, 8 //显然它等于前面 i - 1 位放 k (k≤j) 的方案数之和。 9 signed main(){ 10 int n,m; 11 int ans=0; 12 cin>>n>>m; 13 for(int i=1;i<=n;i++) dp[1][i]=1; 14 for(int i=2;i<=2*m;i++){ 15 for(int j=1;j<=n;j++){ 16 for(int k=1;k<=j;k++){ 17 dp[i][j]=(dp[i][j]+dp[i-1][k])%mod; 18 } 19 } 20 } 21 for(int i=1;i<=n;i++){ 22 ans=ans+dp[2*m][i]; 23 ans=ans%mod; 24 } 25 cout<<ans; 26 return 0; 27 }
二分
-
二分的check如何判断
check(x)思路,把数组转化成二进制形式,如果当前为大于x,则改位二进制数为1,否则为零,最后的到的二进制数即可替代数组。
-
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define int long long 4 #define N 300009 5 int arr[N][20]; 6 int vis[N]; 7 int n,m; 8 int ansx,ansy; 9 int check(int K){ 10 for(int i=0;i<=300;i++) vis[i]=0; 11 for(int i=1;i<=n;i++){ 12 int sum=0; 13 for(int j=1;j<=m;j++){ 14 if(arr[i][j]>=K) 15 sum|=1<<(j-1); 16 } 17 vis[sum]=i; 18 } 19 for(int i=0;i<=256;i++){ 20 for(int j=0;j<=256;j++){ 21 if(vis[i]&&vis[j]&&(((1<<m)-1)==(i|j))){ 22 ansx=vis[i]; 23 ansy=vis[j]; 24 return 1; 25 } 26 } 27 } 28 return 0; 29 } 30 signed main(){ 31 cin>>n>>m; 32 for(int i=1;i<=n;i++) 33 for(int j=1;j<=m;j++) 34 cin>>arr[i][j]; 35 int l=0;int r=1000000000; 36 ansx=0; 37 ansy=0; 38 while(l<=r){ 39 int mid=(l+r)/2; 40 if(check(mid)){ 41 l=mid+1; 42 }else{ 43 r=mid-1; 44 } 45 } 46 cout<<ansx<<" "<<ansy; 47 return 0; 48 }