Educational Codeforces Round 80 (Rated for Div. 2)【A,B,C,D】C题DP{GG了} D题【数组转化成二进制形式判断+二分】

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"<<‘\n‘;
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"<<‘\n‘;
28         }else{
29             cout<<"NO"<<‘\n‘;
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"<<‘\n‘;
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<<‘\n‘;
28     }
29     return 0;
30 }

不会DPQAQ

  • 题意:用n个数字(1~n),构造两个长度为m的序列满足以下条件:

    • ai≤bi(1≤i≤m)?
    • a序列不递减
    • b序列不递增

    问有多少种方案?

  • 分析:
    • 根据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 }

原文地址:https://www.cnblogs.com/pengge666/p/12198058.html

时间: 2024-10-12 16:34:12

Educational Codeforces Round 80 (Rated for Div. 2)【A,B,C,D】C题DP{GG了} D题【数组转化成二进制形式判断+二分】的相关文章

Educational Codeforces Round 80 (Rated for Div. 2)

\[Educational\ Codeforces\ Round\ 80\ (Rated\ for\ Div.\ 2)\] A.Deadline 打勾函数找最小值,在\(\sqrt{d}\)邻域里找\(x\)最小化\(x+\lceil\frac{d}{x+1}\rceil\)即可 //#pragma comment(linker, "/STACK:1024000000,1024000000") #include<bits/stdc++.h> using namespace

Educational Codeforces Round 80 (Rated for Div. 2)(C - Two Arrays )

C - Two Arrays 题目链接:https://codeforces.com/contest/1288/problem/C 题目: 题意:给你n,m,利用1~n之间的数(可重复)来组成长度为m的数组a,b,要求数组a非递减,数组b非递增,且a数组的数<=b数组中的数,求出a,b数组对数 思路:用动态规划,dp[i][j]是第i个位置放数字j的方案数,根据题意可以将b数组反置然后接在a后面,则该数组长度为2m,为一个非递减序列,则就是求1~n这些数字可重复组成多少种长度为2m的非递减序列,

Educational Codeforces Round 80 (Rated for Div. 2)参加感悟

这次比赛有14000+的人报名,结果我得了266名,创了新纪录. 进过这次比赛,我有回答了1800+. 寒假到了,又可以每次比赛都打了.平时进步很慢,我希望能在寒假有更大的进步. 作为寒假第一场比赛,发挥让我还是很满意的. 开始讲题: A: http://codeforces.com/contest/1288/problem/A 这题太水了,直接是sqrt(d)-1和sqrt(d),如果它们不行,那么其他的也肯定不行. 直接上代码: 1 #include<bits/stdc++.h> 2 #d

Educational Codeforces Round 80 (Rated for Div. 2(A Deadline )

(A) Deadline 题目: 思路:一开始还傻傻的暴力康康....只要求出令x=n的一半就行,然后判断 1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 //freopen("text","r",stdin); 6 int T; 7 scanf("%d",&T); 8 while(T--) 9 { 10 //cout<<cei

题解 Educational Codeforces Round 80 [Rated for Div. 2](CF1288)

前言:11点的时候某天下第一可爱的萌神问我怎么不打CF,跑去开题,11:30终于开了C和D,秒了一下,考后萌神轻松上分并告诉我E的tag于是我赛后补题. A:n/x上取整是(n-1)/x+1,式子变形成x+1+(n-1)/(x+1)<=d.根据a+b>=2√ab随便化简一下.(20s秒了??) 1 #include<stdio.h> 2 #include<math.h> 3 using namespace std; 4 int T,n,d,x,y; 5 int main

Educational Codeforces Round 80 (Rated for Div. 2) C - Two Arrays(DP)

???♀? ???♀? ???♀? 题意:从1~n里面选出来m个数字组成a数组,再选出来m个组成b数组,要求a非递减,b非递增,且bi>=ai 1,说是选两个数组其实就是选出来一个长m*2的非递减数组 2,假设要从n的全排列中选出来m长的非递减数组,因为元素是可重复的,最多重复m次,其实就是相当于从下面这个矩阵中选择元素 从这个矩阵中选择元素,每行只能选择一个,枚举我们选出的k个元素的最小值为[ i , j ]位置,那么除去这个元素选择k-1个元素的方案数之和就是k个元素,如图中红色标出位置,最

Educational Codeforces Round 80 (Rated for Div. 2)C(DP)

1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 const long long mod = 1e9+7; 5 long long pre[1007][1007],temp[1007][1007]; 6 int main(){ 7 ios::sync_with_stdio(false); 8 cin.tie(NULL); 9 cout.tie(NULL); 10 int n,m;

Educational Codeforces Round 80 (Rated for Div. 2)部分题解

A. Deadline 题目链接 题目大意 给你\(n,d\)两个数,问是否存在\(x\)使得\(x+\frac{d}{x+1}\leq n\),其中\(\frac{d}{x+1}\)向上取整. 解题思路 方案一:利用均值不等式公式推导 \(x+\frac{d}{x+1}=x+1+\frac{d}{x+1}-1\geq2\sqrt{d}-1\) 所以 \(\min(x+\frac{x}{d+1})=2\sqrt{d}-1\) 因此去判断\(2\sqrt{d}-1\leq n\)是否成,即\(4\

Educational Codeforces Round 80 (Rated for Div. 2) 题解

Deadline Yet Another Meme Problem Two Arrays Minimax Problem Messenger Simulator Deadline \[ Time Limit: 2 s\quad Memory Limit: 256 MB \] 这是个对勾函数,所以最小的话是在 \(sqrt\) 位置,所以只要找这附近的数字就可以了. view /************************************************************