【atcoder】abc318 vp小结

发布时间 2023-11-10 00:03:25作者: 木易meow

开篇碎碎念

下午下课之后没事儿干vp了一手,趁着补完题还有些印象,写一手总结
赛时犯困(开始找理由)+ 又没吃到肯德基老爷爷的蛋挞(这都要扯?)开了三题,赛后补了D和E

A.Full moon

  • 题意:总共有n天,第m天开始,每p天看到一次满月,问总共能看到多少次满月
  • WA一发:忘记统计两端都能看到满月的情况

B.Overlapping sheets

  • 题意:给定n和n个矩形,问总覆盖面积
  • 思路:对于n个矩形,分别标记覆盖了哪些格子,然后统计被覆盖格子的数目
  • WA四发:第一发是读假以为是未被覆盖的格子数目,第二发CE,第三发发现数据范围是0~n,所以遍历应该从下标0开始。最关键的是第四发的修改因为单位为1的格子两个顶点横跨1和2,但是只覆盖了一个格子,所以在模拟填充这个过程的时候应该是一开一闭区间!
  • code:
#include<bits/stdc++.h>
using namespace std;
int ans[105][105];
int main(){
	int n;
	cin>>n;
	int a,b,c,d;
	while(n--){
		cin>>a>>b>>c>>d;
		for(int i=a;i<b;i++){
			for(int j=c;j<d;j++){
				ans[i][j]=1;
			}
		}
	}
	int tot=0;
	for(int i=0;i<=100;i++){
		for(int j=0;j<=100;j++){
			tot+=ans[i][j];
		}
	}
	cout<<tot<<endl;
}

C.Blue Spring

  • 题意:郊游每天价格不一样,每d天可以选择一组价格为p的套票,套票可以有富裕,问最低价格花费
  • 思路:考虑贪心,优先比套票平均价格贵的天数选择套票,如果天数非整套,那么取少半张套票和套票有富裕两种情况的最小值。
  • wa一发:天数没有初始化

D.General Weighted Max Matching

  • 题意:给你一个加权无向完整图,在以下条件下选择一定数量的边时,请找出所选边的最大可能总重量。所选边的端点是成对不同的。
  • 思路:暴搜,状压;第i位为1时表示i已经链接。
  • code:
#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int MAXN=20;
int a[MAXN][MAXN];
int dp[1<<MAXN];
int n;
int dfs(int x){
	if(dp[x]!=-1){
		return dp[x];
	}
	int ans=0,pre;
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			if((x>>i)&1 && (x>>j)&1){
				pre=x-(1<<i)-(1<<j);
				ans=max(ans,dfs(pre)+a[i][j]);
			}
		}
	}
	return dp[x]=ans;
}
signed main(){
	cin>>n;
	memset(dp,-1,sizeof dp);
	dp[0]=0;
	for(int i=1;i<n;i++){
		for(int j=i+1;j<=n;j++){
			cin>>a[i][j];
			a[j][i]=a[i][j];
		}
	}
	int ans=0;
	for(int i=2;i<(1<<(n+1));i++){
		ans=max(ans,dfs(i));
	}
	cout<<ans<<endl;
	return 0;
}

E.Sandwiches

注意贡献的计算!本质是讨论中间位置