作业
P1796 汤姆斯的天堂梦
dp
#include<bits/stdc++.h>
using namespace std;
int f[102][102];
int n , k;
int main () {
cin >> n;
for(int i = 1 ; i <= n ; i ++){
cin >> k;
for(int j = 1; j <= k ; j ++){
f[i][j] = 1e9;
int c , val;
cin >> c;
while(c != 0){
cin >> val;
f[i][j] = min(f[i - 1][c] + val , f[i][j]);
cin >> c;
}
}
}
int ans = 1e9;
for(int i = 1 ; i <= k ; i ++){
ans = min(ans , f[n][i]);
}
cout << ans << endl;
}
P1806 跑步
背包
#include<bits/stdc++.h>
using namespace std;
long long ans;
int n ;
long long f[5201];
int main () {
cin >> n;
f[0] = 1;
for(int i = 1 ; i <= n ; i ++){
for(int j = n ; j >= i ; j --){
f[j] += f[j - i];
}
}
cout << f[n] - 1<< endl;
}
P8742 [蓝桥杯 2021 省 AB] 砝码称重
判断加减的有无标记即可
#include<bits/stdc++.h>
using namespace std;
int n,ans,sum,w[101],f[101][100001];
int main(){
scanf ("%d",&n);
for(int i=1;i<=n;i++){
scanf ("%d",&w[i]);
sum+=w[i];
}
for(int i=1;i<=n;i++){
for(int j=sum;j;j--){
if(j==w[i])f[i][j]=1;
else if(f[i-1][j])f[i][j]=1;
else if(f[i-1][j+w[i]])f[i][j]=1;
else if(f[i-1][abs(j-w[i])])f[i][j]=1;
}
}
for(int i=1;i<=sum;i++)ans += f[n][i];
printf ("%d",ans);
return 0;
}
P1959 遗址
通过两个点推导出其他两个点,判断有无,之后算面积
#include<bits/stdc++.h>
using namespace std;
bool f[5020][5020];
int x[3020];
int y[3020];
int n , m;
int main () {
cin >> n ;
for(int i = 1;i <= n;i ++)
{
cin >> x[i] >> y[i];
f[x[i]][y[i]] = 1;
}
int ans = 0;
for(int i = 1;i <= n;i ++)
{
for(int j=1;j<=n;j++)
{
int a = x[i] - x[j];
int b = y[i] - y[j];
int nx = x[i] - b;
int vx = x[j] - b;
int ny = y[i] + a;
int vy = y[j] + a;
if(nx < 1 || nx > 5000 || vx < 1 || vx > 5000 || ny < 1 || ny > 5000 || vy < 1 || vy > 5000)continue;
if(f[nx][ny] && f[vx][vy])
{
ans = max(ans , a * a + b * b);
}
}
}
printf("%d\n",ans);
return 0;
}
P8794 [蓝桥杯 2022 国 A] 环境治理
二分+Floyd
#include<bits/stdc++.h>
using namespace std;
long long n,q;
long long ans = 10000000000000;
long long edge[108][108];
long long L[108][108];
long long dis[108][108],down[108];
bool check(long long day)
{
long long p = 0,kkk = day - n * (day / n);
for(int i = 1;i <= n;i++)
down[i] = day / n + bool(i <= kkk);
for(int i = 1;i <= n;i++)
dis[i][i] = 0;
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
dis[i][j] = max(edge[i][j] - down[i] - down[j],L[i][j]);
for(int k = 1;k <= n;k++)
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
dis[i][j] = min(dis[i][j],dis[i][k] + dis[k][j]);
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
p += dis[i][j];
if(p <= q) return true;
else return false;
}
int main(){
cin >> n >> q;
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
cin >> edge[i][j];
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
cin >> L[i][j];
long long l = 0,r = 10000000000000,mid;
while(l < r)
{
mid = (l + r) / 2;
if(check(mid)) r = mid ;
else l = mid + 1;
}
if(l == 10000000000000) cout << "-1" << endl;
else cout << l << endl;
return 0;
}

浙公网安备 33010602011771号