A
签到题 我们可以分析出来符合条件的数是长度为7的区间有一个
于是直接算有多少个区间 在判断一下除以区间后多的一点点范围 看是否有符合条件的
(用1<<n算2的高次会出错....)
#include <bits/stdc++.h> #define ll long long const ll N=55; const ll INF=1e9+5; using namespace std; ll n,m,ans; ll pow2(ll a,ll n){ ll res = 1; while(n){ if(n&1) res *= a; a *= a; n >>= 1; } return res; } int main() { ios::sync_with_stdio(false); cin>>n>>m; n=pow2(2,n);m=pow2(2,m); ans=(m-n)/7; if(n%7==1&&m%7>1) ans++; cout<<ans<<endl; return 0; }
B
真签到 按照题目意思模拟 直接就过了(还以为有什么坑...)
#include <bits/stdc++.h> #define ll long long const ll N=55; const ll INF=1e9+5; using namespace std; ll t,n,a,b; int main() { ios::sync_with_stdio(false); cin>>t; while(t--) { ll ans=0; cin>>n; for(int i=1;i<=n;++i) { cin>>a>>b; ans+=a*b; } cout<<ans<<endl; } return 0; }
C
目前不会这么变态的题目....
D
取石子 直接猜了个奇数石子是分成 1和n-1 n-1与偶数合并 所以奇数石子对答案无贡献
直接统计偶数石子的个数就行了 奇数Bob 偶数Alice 特判一下0个偶数就行了
#include <bits/stdc++.h> #define ll long long const ll N=1e4+5; const ll INF=1e9+5; using namespace std; ll n,a[N]; int main() { ios::sync_with_stdio(false); cin>>n; ll k=0; for(int i=1;i<=n;++i) { cin>>a[i]; if(a[i]%2==0) k++; } if(k==0) cout<<"Bob"<<endl; else if(k==1) cout<<"Bob"<<endl; else if(k%2)cout<<"Bob"<<endl; else cout<<"Alice"<<endl; return 0; }
E
比赛时比较难的了(QAQ菜鸡不会算大小 想不到要高精 肯定会wa飞)
解法就是 高精+区间dp
区间dp还是比较套路的 看题目描述在多想一会应该能想到的
设dp[i][j]为ij范围构成三角形的最小值
对于[i,j]这样一个范围 我们怎么求最小 选其中的一点k与首尾构成三角形
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+a[i] * a[j] * a[k]) 来寻找最优
j-i+1 长度从小到大遍历 k从i+1到j-1遍历
这样就行了 注意相乘会超过ll范围 要使用__int128
(cout输出128还不行 只好用了别人的一个输出板子)
#include <bits/stdc++.h> #define ll long long const ll N=55; const __int128 INF=1e30; using namespace std; inline void write(__int128 x) { if (!x) { putchar('0'); return; } char F[40]; __int128 tmp = x > 0 ? x : -x; if (x < 0)putchar('-'); int cnt = 0; while (tmp > 0) { F[cnt++] = tmp % 10 + '0'; tmp /= 10; } while (cnt > 0)putchar(F[--cnt]); } ll n,a[N]; __int128 dp[N][N]; int main() { cin>>n; for(int i=1;i<=n;++i)cin>>a[i]; for(int len=3;len<=n;++len) { for(int i=1;i+len-1<=n;++i) { int j=i+len-1; dp[i][j]=INF; for(int k=i+1;k<j;++k) { dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+(__int128)a[i]*a[k]*a[j]); } } } write(dp[1][n]); return 0; }