A.小A买彩票
Solution
DP
表示第
次摸奖能摸到
的次数,
(
表示本次摸到的奖)
这个好像不能优化空间,改成滚动数组。记忆化搜索
组合数学
Code
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const ll N = 1e6 + 5;
int n;
ll f[35][200];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
f[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=4*i;j>0;j--)
for(int k=1;k<=4;k++)
if(j-k>=0)
f[i][j]+=f[i-1][j-k];
ll cnt=0,tot=0;
for(int i=n;i<=4*n;i++)
if(i>=3*n)
cnt+=f[n][i];
else
tot+=f[n][i];
ll sum=cnt+tot;
cout<<cnt/__gcd(cnt,sum)<<"/"<<sum/__gcd(cnt,sum)<<'\n';
return 0;
}B.「金」点石成金
Solution
的范围很小,DFS选和不选即可。
Code
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const ll N = 15 + 5;
int n;
ll a[N],b[N],c[N],d[N];
ll ans=NINF;
void dfs(int x,ll u,ll v){
if(x==n){
ans=max(ans,1ll*u*v);
return;
}
int tx=x+1;
dfs(tx,u+a[tx],(v>b[tx]?v-b[tx]:0));
dfs(tx,(u>d[tx]?u-d[tx]:0),v+c[tx]);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i]>>b[i]>>c[i]>>d[i];
dfs(0,0,0);
cout<<ans;
return 0;
}E.
Solution
所在点为
- 记录行的最小值并减掉 (算最小值时跳过
所在点,操作时不跳过)
- 记录列的最小值并减掉 (算最小值时跳过
所在点,操作时不跳过)
Code
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const ll N = 1e3 + 5;
int n,sx,sy;
ll a[N][N],r[N],c[N];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
if(a[i][j]==-1){
sx=i,sy=j;
}
}
}
for(int i=1;i<=n;i++) r[i]=c[i]=INF;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==sx && j==sy) continue;
r[i]=min(r[i],a[i][j]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
a[i][j]-=r[i];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==sx && j==sy) continue;
c[j]=min(c[j],a[i][j]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
a[i][j]-=c[j];
}
}
cout<<-1-a[sx][sy]<<'\n';
return 0;
}
京公网安备 11010502036488号