最近做题小结

https://www.luogu.com.cn/problem/AT_abc374_e

这题是一个小学数学问题 但是我还是没做出来
首先做这道题要有一个性价比的思想 我们肯定优先使用性价比高的机器 为什么呢 注意到数据范围 ai bi 都是小于100的
也就是说 最极限的情况就是100 1 这样的 也就是说性价比的机器我们最多选100台 否则101台我还不如花那些钱去买一台性价比高的呢 但是我做的时候犯了一个错误 我盲目的先买性价比高的 导致wa 为什么呢

2 1570
16 336 3 59
14 636 13 614
std输出:16

每一个单位收费需要多少钱 钱多表示不好
比如这个 336 /16 =21 59/3~20
636/14=45 614/13=47
这样就不好 比如买16的价值 盲目买好的 第一道工序就花更多钱了 第二道也是

点击查看代码
#include<bits/stdc++.h>
#define int long long 
#define debug cout<<endl<<"--------"<<endl;
using namespace std;
const int range=2e5+10;
int n;
int x;
//int w[range];
int a[range];int p[range];
int b[range];int q[range];
bool check(int mid)
{
	//最多100个不选 
	//mid是生产能力 
	int sum=0;
	for(int i=1;i<=n;i++)
	{
		sum+=mid/a[i]*p[i];
		int cy=mid%a[i];
		int money=p[i];
		for(int j=0;j<=100;j++)
		{
			int cost=j*q[i];
			int val=b[i]*j;
			if(val>=cy){
				money=min(money,cost);
				break;
			}
		}
		sum+=money;
	}	
	
	if(sum<=x){
//		cout<<mid<<endl;
		return 1;}
//	cout<<sum<<" "<<mid<<endl;
	return 0;
}
void solve()
{
	
	cin>>n>>x;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i]>>p[i]>>b[i]>>q[i];
		double xx=p[i]*1.0/a[i];
		double ww=q[i]*1.0/b[i];
		//一个产品的成本多少钱 
		if(xx>ww){
			swap(a[i],b[i]);
			swap(p[i],q[i]);
		}		
	}
     int l=0;
	int r=1e9;
	int ans=0;
	while(l<=r)
	{
		int mid=l+r>>1;
		if(check(mid))
		{
			ans=mid;
		     l=mid+1;
		}
		else r=mid-1;		
	}
    cout<<ans<<endl; 
	
	
	
	return ;
}

signed main()
{
	ios::sync_with_stdio();
	cin.tie(0);
	cout.tie(0);	
	solve();
	
	
}

所以我们这里应该直接枚举低的先 剩下的给好的买


		for(int j=0;j<=100;j++)
		{
			temp=min(temp,(mid-b[i]*j+a[i]-1)/a[i]*p[i]+j*q[i]);
		}

https://www.luogu.com.cn/problem/AT_abc374_d

dfs练习好题
是因为没注意数据范围 想了半天 贪心
知道是dfs 就没话说了 正常写就好了


int s, t;
int a[range];
int b[range], c[range], d[range];
double cal(int x, int y, int xx, int yy) {
	double ans = 0;
	ans = sqrt((x - xx) * (x - xx) + (y - yy) * (y - yy)) * 1.00;
	return ans;
}
double num = 1e18;
bool vis[range];
void dfs(int x, int y, int step, double ans) {
	//
	if (step == n) {
		num = min(num, ans);
		return ;
	}
	for (int i = 1; i <= n; i++) {
		//计算xy到ai bi的距离
		if(vis[i])continue;
		vis[i]=1;
		double x1 = cal(x, y, a[i], b[i]) * 1.0 / s;
		double x2 = cal(a[i], b[i], c[i], d[i]) * 1.0 / t;
		double x3 = cal(x, y, c[i], d[i]) * 1.0 / s;
		dfs(c[i], d[i], step + 1, ans + x1 + x2);
		dfs(a[i], b[i], step + 1, ans + x3 + x2);
		vis[i]=0;
	}
}
void solve() {
	cin >> n >> s >> t;
	for (int i = 1; i <= n; i++) {
		cin >> a[i] >> b[i] >> c[i] >> d[i];
	}
	dfs(0, 0, 0, 0);
	cout<<setprecision(10)<<fixed<<num<<endl;
}

https://www.luogu.com.cn/problem/AT_abc374_c

这道题 题目都没读懂 看的题解才看懂了 很明显 不是sum/2这种 因为不是人数可以随便分配

所以只能枚举所有可能 时间是 2^n nmax是20 轻松通过


int a[range];
void dfs(int x, int now) {
	if (x > n) {
		ans = min(ans, max(now, sum - now));
		return;
	}
	dfs(x + 1, now + a[x]);
	dfs(x + 1, now);
}
void solve() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		sum += a[i];
	}
//	cout<<sum<<endl;
//	int w=sum/2+1;
//	cout<<w<<endl;
//
	dfs(1, 0);
	cout << ans << endl;
}
posted @ 2024-11-17 20:32  LteShuai  阅读(15)  评论(0)    收藏  举报