A 悬崖
思路:就两种情况
第一种n>x,只能跳一次,长度为x
第二种n<=x,可以跳n次,长度为n*x
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
signed main(){
int n,x;
cin>>x>>n;
if(n>x){
cout<<x;
}
else {
cout<<(long long)n*x;
}
}
B 数数
思路:简单的递推,记录递推的次数就行,然后套用他给的dfs模板就行
#include<iostream>
#include<algorithm>
using namespace std;
int n;
long long ans=0,num=0;;
void dfs(int cnt){//cnt从1开始 如同dfs(1)
num++;
if(num>n)return ;
for(int i=1;i<=cnt;i++)ans++;
dfs(cnt+2);
//1,1,2,3,1,2,3,4,5
}
int main(){
cin>>n;
dfs(1);
cout<<ans;
}
C 山楂
思路:这题分三种情况。
第一种:当当前糖果个数小于等于2时当前贡献值为0
第二种:当当前值为5时,最优是用4个糖果合并
第三种:除了第一种和第二种其他的都能由3和4的倍数组成
#include<iostream>
#include<algorithm>
using namespace std;
const int N=10;
long long a[N];
long long sum=0;
int main(){
for(int i=1;i<=8;i++)cin>>a[i];
for(int i=1;i<=8;i++){
if(a[i]==5){
a[i+1]++;
sum+=(long long)(4*i);
continue;
}
if(a[i]<=2)continue;
sum+=(long long)(i*a[i]);
a[i+1]+=(a[i]/3);
}
cout<<sum;
}
D 切糕
思路:我们可以先统计满足一组匹配括号的个数为cnt,然后通过排列组合,可以找到最终的答案是2^(cnt-1),这里要特判cnt是不是大于0,其他不满足条件无非就是括号多了,或者括号不能组成匹配的
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int mod=1e9+7;
long long qmi(int a,long long b){
long long res=1;
while(b){
if(b&1)res=(long long)res*a%mod;
b>>=1;
a=(long long)a*a%mod;
}
return res;
}
int main(){
string s;
cin>>s;
long long ans=0;
int zuo=0,you=0;
if(s[0]==')'){
cout<<-1<<endl;
return 0;
}
for(int i=0;i<s.size();i++){
if(s[i]=='('){
zuo++;
}
else{
zuo--;
}
if(zuo==0){
ans++;
}
if(zuo==-1){
cout<<-1;
return 0;
}
}
if(ans&&zuo==0)cout<<(long long)qmi(2,max(0ll,ans-1))%mod;
else{
cout<<-1;
}
}
E 筑巢
思路:存无向图,然后从根节点遍历每一个点所能达到的最大舒适度
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int N=1e5+7;
typedef long long ll;
long long a[N],b[N];
typedef pair<int,int>pii;
vector<pii>g[N];
int n;
void dfs(ll u,ll v){
b[u]=a[u];
for(auto [to,val]:g[u]){
if(to==v)continue;
dfs(to,u);
if(val+b[to]>=0){
b[u]+=val+b[to];
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<n;i++){
int a,b,c;
cin>>a>>b>>c;
g[a].push_back({b,c});
g[b].push_back({a,c});
}
//递归找每个节点
dfs(1,-1);
long long res=-2e18;
for(int i=1;i<=n;i++){
res=max(res,b[i]);
}
cout<<res;
}
F 交换
思路:tire树(字典树)还没写