自己综合了一些大佬的代码,做个笔记。
其实就是复习一下。。。
我修改一些代码,并代入数据模拟一下(方便理解)
原分享在文中已贴出(大佬讲得十分详细)
// 贪心
从问题的某一初始解出发;
while(能朝给定总目标前进一步)
{
利用可行的决策,求出可行解的一个解元素;
}
由所有解元素组合成问题的一个可行解;
}
// 旅行家
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int i, j, n;
double d1, d2, c, w, ans, p[N], d[N], s[N];
int main()
{
cin >> d1 >> c >> d2 >> p[0] >> n;
for(i = 1; i <= n; i++)
cin >> d[i] >> p[i];
d[n + 1] = d1; // 终点(另一个城市)
d[0] = 0; // 起点加油站距离为0
for(i = 0; i <= n; i++)
s[i] = (d[i + 1] - d[i]) / d2; // 相邻油站(i,i+1)花费的油
i = 0;
while(i < n)
{
j = i + 1, w = c;
while(p[i] < p[j] && w) // 如果i比j价格低且油未装满
{
double now = min(s[j], w); // 避免油箱装满(加油增量最多为路径量)
if (s[i] + now > c) // 避免出界(在便宜的前站多加,上限为c)
now = c - s[i];
s[i] += now; // 多装now
s[j] -= now; // 少装now
w -= now; // 剩余油量减少
j++; // 下一个
}
i = j;
}
for(i = 0; i <= n; i++)
{
if (s[i] > c) // 加油量大于容量
{
cout << "No Solution"; // 无解快乐
return 0;
}
ans += p[i] * s[i]; // 统计
}
cout << fixed << setprecision(2) << ans;
return 0;
}
https://www.acwing.com/blog/content/245/
// 特技飞行(贪心排序)
#include <bits/stdc++.h>
using namespace std;
const int N = 1100;
int n, m, k, a[N], ans;
int cmp(int a, int b)
{
return a > b;
}
int main()
{
cin.tie(0); // 解除cin与cout绑定
ios::sync_with_stdio(false); // 打消iostream的输入 输出缓存
cin >> n >> k;
for(int i = 1; i <= k; i++)
cin >> a[i];
sort(a + 1, a + 1 + k, cmp); // 贪心排序(由大到小)
m = n - 1; // 最大距离
for(int i = 1;i <= min(k, n / 2); i++)
{
ans += a[i] * m; // 加上本次项目的价值
m -= 2; // 距离减少两个
}
cout << ans;
return 0;
}
https://www.acwing.com/blog/content/246/
// 斐波那契
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 110;
int f[N], x, n;
inline int check(int x)
{
int cnt = 0, p = 0;
while(x)
{
p = lower_bound(f + 1, f + 1 + 98, x) - f; // p 大于等于x中 最小数下标
x = min(x - f[p - 1], f[p] - x); // p-1 小于等于x中 最大数下标
cnt++;
}
return cnt;
}
inline void init()
{
cin >> n;
f[0] = 0;
f[1] = 1;
for(int i = 2; i <= 98; i++)
f[i] = f[i - 1] + f[i - 2]; // 建立斐波那契数列
while(n--)
{
cin >> x;
cout << check(x) << endl;
}
}
signed main()
{
init();
return 0;
}
https://www.acwing.com/blog/content/769/
// sticks
#include <bits/stdc++.h>
const int N = 1000010;
using namespace std;
int i, n, t, tot, s1, s2, s3;
struct node
{
int c, l;
} a[N];
int cmp(node a, node b) // 对l排序
{
return a.l < b.l;
}
int main()
{
cin >> n;
for(i = 1; i <= n; i++)
{
cin >> t;
while(t--)
{
a[++tot].c = i;
cin >> a[tot].l;
}
}
sort(a + 1, a + 1 + tot, cmp);
for(i = 1; i <= tot; i++) // s1为最长木棒,s2次之,s3再次之
{
if(a[i].c == a[s1].c) // 和s1颜色相同
{
if(a[s3].l + a[s2].l > a[i].l)
{
cout << a[s3].c << " " << a[s3].l << " " << a[s2].c << " " << a[s2].l << " " << a[i].c << " " << a[i].l;
break;
}
s1=i; // 此棒变为为s1
}
else if(a[i].c == a[s2].c) // 和s2颜色相同
{
if(a[s3].l + a[s1].l > a[i].l)
{
cout << a[s3].c << " " << a[s3].l << " " << a[s1].c << " " << a[s1].l << " " << a[i].c << " " << a[i].l;
break;
}
s2 = s1, s1 = i; // s1变为s2,此棒变为s1
}
else // 和s3颜色相同
{
if(a[s2].l + a[s1].l > a[i].l)
{
cout << a[s2].c << " " << a[s2].l << " " << a[s1].c << " " << a[s1].l << " " << a[i].c << " " << a[i].l;
break;
}
s3 = s2, s2 = s1, s1 = i; // s2变为s3,s1变为s2,此棒变为s1
}
}
if(i > tot)
cout << "NIE";
return 0;
}
https://www.acwing.com/blog/content/771/
以上题解均来自秦淮岸大大