zoukankan      html  css  js  c++  java
  • Codeforces Round #672 (Div. 2)9月24号思维(时间复杂度)A+位运算二进制B+动态规划C

    A. Cubes Sorting

     题意:给一个数组,只能相邻两两交换排序,问排序的次数是否超过n(n-1)/2-1,超过则输出no没超过输出yes;

    思路:看起来这是一个冒泡排序,但我们知道,冒泡排序最坏的情况的时间复杂度是n*(n-1)/2,刚好比题意中大,所以只有当这个数组严格降序的时候才会不符合,所以只用判断是不是严格降序就ok了。

     1 #include <bits/stdc++.h>
     2 #define  int long long
     3 #define IOS ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
     4 const int maxn=5e4+50;
     5 const int INF=0x3f3f3f3f;
     6 int a[maxn];
     7 using namespace std;
     8 signed main(){
     9   IOS;
    10   int t;cin>>t;
    11   while(t--){
    12   
    13   int n;
    14       cin>>n;
    15       for(int i=0;i<n;i++)cin>>a[i];
    16       int flag=0;
    17       for(int i=0;i<n-1;i++){
    18           if(a[i]<=a[i+1]){
    19               flag=1;break;
    20           }
    21       }
    22       //for(int i=0;i<n;i++)cout<<a[i]<<" ";
    23      
    24       if(flag==1)cout<<"yes"<<'
    ';
    25       else cout<<"no"<<'
    ';
    26 }
    27  return 0;
    28 }

    B. Rock and Lever

     

     题意:给一个数组求i<j且a[i]&a[j]>=a[i]^a[j];

    思路:当转化的二进制位数相同的时候,符合题意(至于为什么,看到了一个解释的很好的)看这里

    把每个数转化二进制最多32位吧,然后如果有n个相同的位数,就加上n(n-1)/2

    #include <bits/stdc++.h>
    #define  int long long
    #define IOS ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
    const int maxn=2e5+50;
    const int INF=0x3f3f3f3f;
    using namespace std;
    int a[maxn];
    signed main(){
      IOS;
     int t;cin>>t;
     while(t--){
         int n;cin>>n;
         int b[32];
         for(int i=0;i<=32;i++)b[i]=0;
         for(int i=0;i<n;i++){
            cin>>a[i];
            int j=0;
            while(a[i]){
                a[i]/=2;
                 j++;
             }
             b[j]++;//cout<<b[j]<<"&&"<<j<<" ";
             }
         int ans=0;
         for(int i=1;i<=32;i++){
             if(b[i]>1){    
             int cnt=b[i];
            ans+=cnt*(cnt-1)/2;
             }
         
         }
         cout<<ans<<'
    ';
     }
     return 0;
    }

    C1. Pokémon Army (easy version)

     

     

     题意:就是给一些数组然后求一段数的和最大,而且这段和需要一个加一个减的交错

    思路:用动态规划dp[i][0]表示最后一个数是加上去的,dp[i][1]表示最后一个数是减的,然后求最大就好了

    因为k=0所以不用考虑修改的问题;

    #include <bits/stdc++.h>
    #define  int long long
    #define IOS ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
    
    using namespace std;
    const int maxn=3e5+50;
    const int INF=0x3f3f3f3f;
    int a[maxn];
    int dp[maxn][2];//两种状态,0表示加结尾,1表示减结尾 
    signed main(){
      IOS;
      int t;
      cin>>t;
    while(t--){
        int n,q;
        cin>>n>>q;
        for(int i=0;i<n;i++){
            cin>>a[i];
        } 
    
        for(int i=0;i<n;i++){
        dp[i][0]=max(dp[i-1][0],dp[i-1][1]+a[i]);
        dp[i][1]=max(dp[i-1][1],dp[i-1][0]-a[i]);
        }    
         int maxx=max(dp[n-1][0],dp[n-1][1]);
         cout<<maxx<<'
    ';
    }
     return 0;
    }
  • 相关阅读:
    第三次冲刺
    [操作系统]实验四
    第二个冲刺5.0
    第二个冲刺
    学术诚信与职业道德--个人感想
    软件工程——sprint 1回顾总结
    [读书笔记]
    sprint5.0
    [操作系统]3.0
    学习进度条
  • 原文地址:https://www.cnblogs.com/ahijing/p/13733104.html
Copyright © 2011-2022 走看看