最近做题小结
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;
}

浙公网安备 33010602011771号