作业介绍
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5+5,Mod=1e9+7;
int n;
string s;
int f[N][3];
signed main(){
cin>>n;
cin>>s;
int power = 1;
for(int i=1;i<=s.size();i++){
if(s[i-1]=='?'){
f[i][0] = (3*f[i-1][0]%Mod+power)%Mod;
f[i][1] = (3*f[i-1][1]%Mod+f[i-1][0])%Mod;
f[i][2] = (3*f[i-1][2]%Mod+f[i-1][1])%Mod;
power=power*3%Mod;
}
else{
f[i][0] = f[i-1][0];
f[i][1] = f[i-1][1];
f[i][2] = f[i-1][2];
if(s[i-1]=='a')f[i][0]+=power,f[i][0]%=Mod;
if(s[i-1]=='b')f[i][1]+=f[i-1][0],f[i][1]%=Mod;
if(s[i-1]=='c')f[i][2]+=f[i-1][1],f[i][2]%=Mod;
}
}
cout<<f[s.size()][2]<<endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5+5,Mod=998244353;
int n,k,f[2][N],g[N],sum[N];
signed main(){
cin>>n>>k;
int pos = 0;
for(int i=k;i<=n;i+=k){
f[pos][i] = 1;
g[i] = f[pos][i];
}
for(int j=2;j<=700;j++){
if(j>n)break;
for(int i=0;i<=n;i++){
if(i>=(k+j-1))sum[i]=sum[i-k-j+1]+f[pos][i];
else sum[i] = f[pos][i];
sum[i]%=Mod;
}
pos^=1;
for(int i=0;i<=n;i++){
if(i>=k+j-1){
f[pos][i]+=sum[i-k-j+1];
}
g[i]+=f[pos][i];g[i]%=Mod;
}
memset(sum,0,sizeof(sum));
memset(f[pos^1],0,sizeof(f[pos^1]));
}
for(int i=1;i<=n;i++){
cout<<g[i]%Mod<<" ";
}
return 0;
}
//f[x][i]第i轮干掉x,他的子树一共造成的伤害
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 3e5+5;
int T,n,a[N],f[N][21];
vector<int>e[N];
void dfs(int x,int fa){
for(int i=1;i<=20;i++)f[x][i] = a[x]*i;
for(auto v:e[x]){
if(v==fa)continue;
dfs(v,x);
for(int i=1;i<=20;i++){
int res =1e18;
for(int j=1;j<=20;j++){
if(j==i)continue;
res = min(res,f[v][j]);
}
f[x][i]+=res;
}
}
}
signed main(){
cin>>T;
while(T--){
cin>>n;
for(int i=1;i<=n;i++){
e[i].clear();
cin>>a[i];
}
for(int i=1;i<n;i++){
int x,y;
cin>>x>>y;
e[x].push_back(y);
e[y].push_back(x);
}
dfs(1,0);
int res = 1e18;
for(int i=1;i<=20;i++){
res = min(res,f[1][i]);
}
cout<<res<<endl;
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e7+5;
int n,x,y;
int f[N],q[N],tail=-1,head=0;
signed main(){
cin>>n>>x>>y;
f[1] = x;
//f[i] = min(f[j]+2*j*x)+y-i*x i/2<=j<i
for(int i=2;i<=n;i++){
while(tail>=head && f[i-1]+2*(i-1)*x<=f[q[tail]]+2*q[tail]*x)tail--;
q[++tail] = i-1;
while(tail>=head && q[head]<i/2.0)head++;
int j = q[head];
f[i] = min(f[j]+2*j*x+y-i*x,f[i-1]+x);
}
cout<<f[n]<<endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
//f[60][x][y] a/2^x b/2^y的最小代价
int f[61][61][61],s[61];
int T,x,y;
signed main(){
s[0] = 1;
for(int i=1;i<=60;i++){
s[i] = s[i-1]*2;
}
memset(f,0x3f,sizeof(f));
for(int i=0;i<=60;i++)f[i][0][0] = 0;
for(int i=1;i<=60;i++){
for(int j=0;j<=60;j++){
for(int k=0;k<=60;k++){
f[i][j][k] = f[i-1][j][k];
if(j>=i)f[i][j][k] = min(f[i][j][k],f[i-1][j-i][k]+s[i]);
if(k>=i)f[i][j][k] = min(f[i][j][k],f[i-1][j][k-i]+s[i]);
}
}
}
cin>>T;
while(T--){
cin>>x>>y;
int res = 1e18;
for(int i=1;i<=60;i++){
for(int j=1;j<=60;j++){
if((x>>i)==(y>>j)){
res = min(res,f[60][i][j]);
}
}
}
cout<<res<<endl;
}
return 0;
}
题目
认领作业后才可以查看作业内容。
- 状态
- 正在进行…
- 题目
- 12
- 开始时间
- 2026-4-7 0:00
- 截止时间
- 2026-4-15 23:59
- 可延期
- 24 小时