作业

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;
}
posted @ 2023-01-10 20:21  wmjlzw1314  阅读(35)  评论(0)    收藏  举报