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"<<'\n';
25       else cout<<"no"<<'\n';
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<<'\n';
 }
 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<<'\n';
}
 return 0;
}

 

posted @ 2020-09-25 23:19  小靖快去敲代码  阅读(109)  评论(0编辑  收藏  举报