• 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"<<'
    ';
    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的序列满足以下条件:

      • aibi(1im)
      • a序列不递减
      • b序列不递增

      问有多少种方案?

    • 分析:

      • 根据a不递减,b不递增,且aibi(1im)ai≤bi(1≤i≤m) 的条件,我们可以得出如果将b序列反向加在a序列后面构成新的序列,这个序列一定是非递减的。所以问题转为2*m的序列,用n个数构成非递减序列的方案数。DP。
      • dp[i][j]表示第 i 个位置放 j 数的方案数,显然它等于前面 i - 1 位放 k (kj) 的方案数之和
    •  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 }
  • 相关阅读:
    poj2253 青蛙
    这代码真是好,真是文艺,转来的
    java.text.MessageFormat
    java多线程的两种实现方式
    javascript with
    面向接口编程
    java 多线程 读写锁
    java 多线程 资源共享
    UML:继承、实现、依赖、关联、聚合、组合
    javascript 语言精粹 学习笔记
  • 原文地址:https://www.cnblogs.com/pengge666/p/12198058.html
Copyright © 2020-2023  润新知