代码
#include<iostream>
#include<algorithm>
using namespace std;
#define int long long
int a,b;
signed main(){
cin>>a>>b;
cout<<((a-b)-b*10);
return 0;
}
思路
我们可以画个图发现,这就是二叉树,然后我们只要求二叉树的节点数就可以了。但别用 dfs
求,因为会超时,于是我们就找规律。
代码
#include<iostream>
#include<cmath>
using namespace std;
#define int long long
const int N = 1e5+10;
int n;
int l,r;
int ans;
// void dfs(int u){
// if(u/2==0)return;
// if(u/2!=0){
// dfs(u/2);
// dfs(u/2);
// ans+=2;
// }
// }
signed main(){
cin>>n;
//就是二叉树
// dfs(n);
// cout<<ans+1;
while(n){
ans++;
n/=2;
}
int res=1;
for(int i=2;i<=ans;i++){
res+=pow(2,i-1);
}
cout<<res;
return 0;
}
思路
这道题就是一道很典型的最大子段和的题目,只不过我们可以在最先的时候减去x就可以做这道题了。(也就是 w i − p w_i-p wi−p,此时就能满足题目的省钱的定义了)
代码
#include<iostream>
using namespace std;
#define int long long
const int N = 1e5+10;
int f[N];
int w[N];
int n,p;
signed main(){
cin>>n>>p;
for(int i=1;i<=n;i++){
cin>>w[i];
w[i]-=p;
}
for(int i=1;i<=n;i++){
f[i]=max(f[i-1]+w[i],w[i]);
}
int res=0;
for(int i=1;i<=n;i++){
res=max(res,f[i]);
}
cout<<res;
return 0;
}
思路
这道题就是打表找规律。
代码
#include<iostream>
#include<algorithm>
#define int unsigned long long
//性质1:奇数末尾为1
//性质2:
using namespace std;
const int N = 2e5+10;
int T,l,r;
int f(int x){
if(x%4==0)return x;
if(x%4==1)return 1;
if(x%4==3)return 0;
return x+1;
}
signed main(){
cin>>T;
while(T--){
cin>>l>>r;
cout<<(f(l-1)^f(r))<<endl;
}
return 0;
}