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;
}