Practice Link

A. gpa

题意:

有\(n\)门课程,每门课程的学分为\(s_i\),绩点为\(c_i\),要求最多删除\(k\)门课程,使得gpa最高。

gpa计算方式如下:

\[\begin{eqnarray*}
gpa = \frac{\sum s_ic_i}{\sum s_i}
\end{eqnarray*}
\]

思路:

首先删去的课程越多,gpa肯定不会变得更差。

所以我们肯定是删去\(k\)门课程。

考虑二分答案,check的时候要满足:

\[\begin{eqnarray*}
gpa &\leq& \frac{\sum s_ic_i}{\sum s_i} \\
gpa \cdot \sum s_i &\leq& \sum s_ic_i \\
\sum s_i \cdot gpa &\leq& \sum s_ic_i \\
\sum s_i \cdot (gpa - c_i) &\leq& 0
\end{eqnarray*}
\]

那么check的时候贪心选取\(n - k\)个即可。

代码:

#include <bits/stdc++.h>
using namespace std; #define ll long long
#define db double
#define N 100010
#define pii pair <int, int>
#define fi first
#define se second
const db eps = 1e-10;
int n, k; pii a[N]; bool ok(db x) {
vector <db> vec;
for (int i = 1; i <= n; ++i) {
vec.push_back(a[i].fi * (x - a[i].se));
}
sort(vec.begin(), vec.end());
db tot = 0;
for (int i = 0; i < n - k; ++i) {
tot += vec[i];
}
return tot <= 0 || fabs(tot - 0) < eps;
} int main() {
while (scanf("%d%d", &n, &k) != EOF) {
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i].fi);
}
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i].se);
}
db l = 0, r = 1e3, res = 0;
while (fabs(r - l) >= eps) {
db mid = (l + r) / 2;
if (ok(mid)) {
l = mid;
res = mid;
} else {
r = mid;
}
}
printf("%.10f\n", res);
}
return 0;
}

G. max

题意:

给出\(c\)和\(n\),要求找到一对\((a, b)\)满足\(1 \leq a, b \leq n\)使得\(gcd(a, b) = c\)并且最大化\(a \cdot b\)

思路:

  • \(c > n\)时无解
  • \(c = n\)时选择\((n, n)\)
  • \(c < n\)时在\([1, \frac{n}{c}]\)中选取两个互质的数再分别乘上\(c\)

代码:

#include <bits/stdc++.h>
using namespace std; #define ll long long
ll c, n; int main() {
while (scanf("%lld%lld", &c, &n) != EOF) {
if (c > n) {
puts("-1");
continue;
}
ll x = n / c;
ll res = c * c;
if (x > 1) {
res *= x * (x - 1);
}
printf("%lld\n", res);
}
return 0;
}

J. plan

题意:

有\(n\)个人去住宿,双人房的价格为\(p_2\), 三人房的价格为\(p_3\),要求将\(n\)个人全都安排好住宿的最小代价是多少,不一定恰好住满。

思路:

大范围直接除2, 除3, 小范围暴力dp一下。

代码:

#include <bits/stdc++.h>
using namespace std; #define N 1000010
#define ll long long
#define ll long long
ll n, p2, p3;
ll f[N]; ll DFS(int x) {
if (x <= 0) {
return 0;
}
if (f[x] != -1) {
return f[x];
}
return f[x] = min(p2 + DFS(x - 2), p3 + DFS(x - 3));
} int main() {
while (scanf("%lld%lld%lld", &n, &p2, &p3) != EOF) {
memset(f, -1, sizeof f);
if (n <= 1000000) {
printf("%lld\n", DFS(n));
} else {
ll res = 1e18;
ll m;
for (int i = 0; i < 1000000; ++i) {
m = n - i;
res = min(res, p2 * (m / 2) + DFS(i + m % 2));
res = min(res, p3 * (m / 3) + DFS(i + m % 3));
}
printf("%lld\n", res);
}
}
return 0;
}

最新文章

  1. Discuz门户首页关键词和描述显示“首页”的解决方法
  2. cronolog分割Tomcat catalina.out日志
  3. B-Tree索引在sqlserver和mysql中的应用
  4. js严格模式总结
  5. 使用 Spring 3 来创建 RESTful Web Services
  6. Linux 2&gt;&amp;1理解(转)
  7. 字符串--java中判断字符串是否为数字的方法的几种方法?
  8. angular依赖注入的理解(转)
  9. 项目源码--Android应用商店源码
  10. 程序员带你学习安卓开发-XML文档的创建与解析
  11. codeforces#1139F. Dish Shopping (离散化数组数组+ 扫描线)
  12. 漏洞复现——Apache HTTPD多后缀解析漏洞
  13. window10 还原精灵 破解版 冰点
  14. android sqlite select count
  15. jquery-事件之页面框架加载后自动执行
  16. [LeetCode] 733. Flood Fill_Easy tag: BFS
  17. 20165310 java_blog_week4
  18. FSCapture截图软件注册码
  19. tomcat+java的web程序持续占cpu问题调试
  20. Cocos2d-x模版卸载及安装

热门文章

  1. scratch少儿编程第一季——07、人要衣装佛靠金装——外观模块
  2. 附录:ARM 手册 词汇表
  3. 怎样在网页中嵌入JS代码
  4. Unity中的Character Controller
  5. android 蓝牙连接端(客户端)封装
  6. 日志(log4j2)
  7. cordova 和 java ( JDK ) 和 android-studio (SDK)的初始安装和配置
  8. javamail &quot;535 5.7.3 Authentication unsuccessful&quot; 问题排查
  9. python matplotlib拟合直线
  10. 4.Java集合-ArrayList实现原理及源码分析