2016 ACM-ICPC EC-Final
UVALive7897 Number Theory Problem (找规律签到)
思路:
8的幂次都是可以的,因为an-1一定能分解成a-1乘上一个多项式。
看不出来也没关系,打表就发现每三个数有一个7的倍数。
代码:
- #include <cstdio>
- using namespace std;
- int main()
- {
- int T, kase = ;
- scanf("%d", &T);
- while (T--) {
- int N;
- scanf("%d", &N);
- printf("Case #%d: %d\n", kase++, N/);
- }
- return ;
- }
UVALive7899 Mr. Panda and Strips (暴搜+尺取+剪枝)
思路:
我也不知道这是什么做法,神棍剪枝吧-。=
尺取大法好(超大声)
- #include <bits/stdc++.h>
- using namespace std;
- const int MAX_N = 1e3 + ;
- const int MAX_C = 1e5 + ;
- int N;
- int C[MAX_N], len[MAX_N];
- int ans;
- bool vis[MAX_C];
- inline void reset() {
- for (int i = ; i <= N; i++) vis[C[i]] = false;
- }
- void init()
- {
- cin >> N;
- for (int i = ; i <= N; i++)
- scanf("%d", C+i);
- C[N+] = ;
- reset();
- }
- inline int jump(int pos, int limit) {
- int l = pos, r = pos, res = -;
- while (r <= N) {
- while (!vis[C[r]] && r <= N) vis[C[r++]] = true;
- if (len[l] < limit) break;
- res = max(res, r-l);
- while ( vis[C[r]] && l <= r) vis[C[l++]] = false;
- }
- for (int i = l; i < r; i++) vis[C[i]] = false;
- return res;
- }
- int main()
- {
- int T, kase = ;
- cin >> T;
- while (T--) {
- init();
- for (int i = ; i <= N; i++, reset()) {
- len[i] = ;
- for (int j = i; j <= N && !vis[C[j]]; j++)
- len[i]++, vis[C[j]] = true;
- }
- len[N+] = ;
- for (int i = N; i >= ; i--)
- len[i] = max(len[i], len[i+]);
- ans = len[];
- for (int i = ; i <= N; i++, reset())
- for (int j = i; j <= N && !vis[C[j]]; j++) {
- vis[C[j]] = true;
- if (ans >= j-i+ + len[j]) continue;
- int res = jump(j+, ans-(j-i+));
- ans = max(ans, j-i+ + res);
- }
- reset();
- printf("Case #%d: %d\n", kase++, ans);
- }
- return ;
- }
- /*
- 3
- 8
- 3 1 2 1 6 1 2 5
- 3
- 1 2 3
- 3
- 1 1 1
- */
UVALive7900 Ice Cream Tower (二分+贪心)
假思路:
贪心地取冰淇淋球,尽可能地早点做出Tower,不能放在之前的冰淇淋上的球当作新的底座。
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int MAX_N = 3e5 + ;
- struct QNode{
- ll val;
- int len;
- QNode(ll v = , int l = ) : val(v), len(l) {}
- };
- ll B[MAX_N];
- queue <QNode> Q;
- int main()
- {
- int T, kase = ;
- cin >> T;
- while (T--) {
- int N, K, ans = ;
- cin >> N >> K;
- for (int i = ; i <= N; i++)
- scanf("%lld", B+i);
- sort(B+, B++N);
- for (int i = N; i >= ; i--) {
- if (Q.empty()) {
- Q.push(QNode(B[i], ));
- continue;
- }
- QNode cur = Q.front();
- if (cur.val/ >= B[i]) {
- Q.pop();
- if (cur.len+ == K)
- ans++;
- else
- Q.push(QNode(B[i], cur.len+));
- }
- else {
- Q.push(QNode(B[i], ));
- }
- }
- while (!Q.empty())
- Q.pop();
- printf("Case #%d: %d\n", kase++, ans);
- }
- return ;
- }
- /*
- 3
- 4 2
- 1 2 3 4
- 6 3
- 1 1 2 2 4 4
- 6 3
- 1 1 2 2 3 4
- */
自我hack【精通】。。codeforces gym上的数据比较强,上面的代码就不能过了。
思路:
二分答案,用上面的贪心法验证。。。。O(Nlog(N/K))
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int MAX_N = 3e5 + ;
- struct Node{
- ll val, len;
- Node(ll v = , ll l = ) : val(v), len(l) {}
- };
- int N, K;
- ll B[MAX_N];
- queue <Node> Q;
- bool solve(int ans){
- while (!Q.empty())
- Q.pop();
- if (K == )
- return true;
- for (int i = ; i <= ans; i++)
- Q.push(Node(B[i], ));
- for (int i = ans+; i <= N; i++) {
- if (Q.empty())
- break;
- Node cur = Q.front();
- if (B[i]/ >= cur.val) {
- Q.pop();
- if (cur.len == K-)
- continue;
- Q.push(Node(B[i], cur.len+));
- }
- }
- return Q.empty();
- }
- int main()
- {
- int T;
- cin >> T;
- for (int kase = ; kase <= T; kase++) {
- cin >> N >> K;
- for (int i = ; i <= N; i++)
- scanf("%lld", B+i);
- sort(B+, B++N);
- int ansl = , ansr = N, ans = ;
- while (ansl <= ansr) {
- int mid = (ansl + ansr) >> ;
- if (solve(mid)) {
- ans = max(ans, mid);
- ansl = mid+;
- }
- else {
- ansr = mid-;
- }
- }
- printf("Case #%d: %d\n", kase, ans);
- }
- return ;
- }
- /*
- 3
- 4 2
- 1 2 3 4
- 6 3
- 1 1 2 2 4 4
- 6 3
- 1 1 2 2 3 4
- */
UVALive7901 Bet (数学+贪心+高精度除法(long double))
思路:
小学数学题-。=
贪心地选性价比高的队伍,能选多个队伍的条件是这些队伍的A/(A+B)的和小于1。。。。这个精度啊。。比赛的时候WA来WA去就是没想到,Dilthey瞄了一眼题解发现是高精度除法,long double够用。。。换上long double就AC了。。在现场的话,不知道这个高精度估计要悔恨终身了。
- #include <bits/stdc++.h>
- using namespace std;
- const int MAX_N = + ;
- const long double money = 1e3 + ;
- const long double eps = 1e-;
- long double A[MAX_N], B[MAX_N], C[MAX_N];
- int main()
- {
- int T;
- cin >> T;
- for (int kase = ; kase <= T; kase++) {
- int N;
- cin >> N;
- for (int i = ; i <= N; i++) {
- char x;
- cin >> A[i] >> x >> B[i];
- C[i] = (long double)A[i] / (A[i] + B[i]);
- }
- sort(C+, C++N);
- int cnt = ;
- long double sum = ;
- while (cnt+ <= N && sum + C[cnt+]*money < money-eps) {
- sum += C[++cnt]*money;
- }
- printf("Case #%d: %d\n", kase, cnt);
- }
- return ;
- }
- /*
- 3
- 2
- 5:3
- 2:7
- 2
- 1:1
- 1:1.01
- 3
- 1:1.1
- 1:0.2
- 1.5:1.7
- */
- /*
- 10
- 12
- 1:10
- 1:10
- 1:10
- 1:10
- 1:10
- 1:10
- 1:10
- 1:10
- 1:10
- 1:10
- 1:10
- 1:10
- 12
- 1:9.9
- 1:9.9
- 1:9.9
- 1:9.9
- 1:9.9
- 1:9.9
- 1:9.9
- 1:9.9
- 1:9.9
- 1:9.9
- 1:9.9
- 1:9.9
- 12
- 1:10.1
- 1:10.1
- 1:10.1
- 1:10.1
- 1:10.1
- 1:10.1
- 1:10.1
- 1:10.1
- 1:10.1
- 1:10.1
- 1:10.1
- 1:10.1
- */
UVALive7908 Great Cells (数学思维+快速幂)
思路:Dilthey的博客
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const ll MOD = ;
- ll fpow(ll a, ll p) {
- ll ans = ;
- while (p) {
- if (p&) ans *= a, ans %= MOD;
- a *= a, a %= MOD;
- p >>= ;
- }
- return ans;
- }
- int main()
- {
- int T;
- cin >> T;
- for (int kase = ; kase <= T; kase++) {
- ll N, M, K;
- cin >> N >> M >> K;
- ll ans = ;
- for (ll i = ; i <= K; i++)
- ans += fpow(i-, N-+M-), ans %= MOD;
- ans *= N*M, ans %= MOD;
- ans *= fpow(K, (N-)*(M-)), ans %= MOD;
- ans += fpow(K, N*M), ans %= MOD;
- printf("Case #%d: ", kase);
- cout << ans << endl;
- }
- return ;
- }
- /*
- 3
- 2 2 2
- 2 3 2
- 3 4 5
- */
UVALive7908 World Cup (3进制状压+枚举)
思路:
把所有的可能答案都预处理出来,有36个,直接枚举时间复杂度为O(4*36T)。
预处理的时候把比赛结果的可能性:胜负,平局,负胜压成六位三进制数即可。
- #include <bits/stdc++.h>
- using namespace std;
- const int l[] = {, , , , , };
- const int r[] = {, , , , , };
- const int len = ;
- int pow(int a, int p)
- {
- int ans = ;
- while (p) {
- if (p&) ans *= a;
- a *= a;
- p >>= ;
- }
- return ans;
- }
- int A[];
- int res[len+][];
- void init()
- {
- memset(res, , sizeof res);
- for (int i = ; i < len; i++) {
- int tmp = i;// mod 3 = 0胜,1平,2败。
- for (int j = ; j < ; j++) {
- if (tmp % == ) {
- res[i][l[j]] += ;
- }
- else if (tmp % == ) {
- res[i][l[j]]++;
- res[i][r[j]]++;
- }
- else if (tmp % == ) {
- res[i][r[j]] += ;
- }
- tmp /= ;
- }
- }
- }
- int main()
- {
- init();
- int T;
- cin >> T;
- for (int kase = ; kase <= T; kase++) {
- for (int i = ; i <= ; i++)
- scanf("%d", A+i);
- int valid = ;
- for (int i = ; i < len; i++) {
- int j;
- for (j = ; j <= ; j++)
- if (A[j] != res[i][j])
- break;
- if (j == ) {
- valid++;
- }
- }
- printf("Case #%d: ", kase);
- if (!valid)
- puts("Wrong Scoreboard");
- else {
- sort(A, A+);
- if (valid > )
- puts("No");
- else
- puts("Yes");
- }
- }
- return ;
- }
- /*
- 3
- 9 6 3 0
- 6 6 6 0
- 10 6 3 0
- */
2016 ACM-ICPC EC-Final的更多相关文章
- 2016 ACM/ICPC Asia Regional Shenyang Online 1009/HDU 5900 区间dp
QSC and Master Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- 2016 ACM/ICPC Asia Regional Shenyang Online 1003/HDU 5894 数学/组合数/逆元
hannnnah_j’s Biological Test Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K ...
- 2016 ACM/ICPC Asia Regional Qingdao Online 1001/HDU5878 打表二分
I Count Two Three Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 2016 ACM/ICPC Asia Regional Shenyang Online 1007/HDU 5898 数位dp
odd-even number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- 2016 ACM/ICPC Asia Regional Dalian Online 1002/HDU 5869
Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K ( ...
- 2016 ACM/ICPC Asia Regional Dalian Online 1006 /HDU 5873
Football Games Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- HDU 5874 Friends and Enemies 【构造】 (2016 ACM/ICPC Asia Regional Dalian Online)
Friends and Enemies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- HDU 5889 Barricade 【BFS+最小割 网络流】(2016 ACM/ICPC Asia Regional Qingdao Online)
Barricade Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- HDU 5875 Function 【倍增】 (2016 ACM/ICPC Asia Regional Dalian Online)
Function Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- HDU 5873 Football Games 【模拟】 (2016 ACM/ICPC Asia Regional Dalian Online)
Football Games Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
随机推荐
- 微信小程序生成二维码
微信小程序客户端生成二维码的方法, 请参考这里: https://github.com/demi520/wxapp-qrcode 代码片段如下: const QR = require(". ...
- js 数组api
Javascript Array API JS数组对象提供了很多API方法,要用到的朋友可以查阅哈,如有错误欢迎指正. /** * Created by Administrator on 2017 ...
- learning scala 数组和容器
数组:可变的,可索引的,元素具有相同类型的数据集合 一维数组 scala> val intValueArr = new Array[Int](3)intValueArr: Array[Int] ...
- frameset的固定放置模式,不能放入<form runat="server">中
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="admin_default.as ...
- linux图形和命令界面切换
一.系统不在虚拟机中的情况 使用ctrl+alt+F1~6切换到命令行界面:ctrl+alt+F7切换到图形界面 二.系统在虚拟机中的情况 Ctrl+Alt+shift+F1~6切换到命令行界面:使用 ...
- nginx配置文件详解(三)
nginx配置文件详细解析 nginx安装目录: /usr/local/nginx 配置文件: /usr/local/nginx/conf 目录下的 nginx.conf文件 nginx优化方法1 ...
- update-alternatives关键解疑
update-alternatives的用法网上到处又有,但有2个知识点好像都没怎么提到: 1.--install 里的参数link到底是啥意思,其实update-alternatives本质就是在/ ...
- ubuntu gnome桌面隐藏顶栏
注意:ubuntu 14.04.5默认的为unity桌面,有多点触发,没有自带Tweak Tool工具.需安装gnome 桌面,可参见我的另一随笔. 环境: ubuntu 14.04.5 gnome ...
- 谷歌开源的TensorFlow Object Detection API视频物体识别系统实现(二)[超详细教程] ubuntu16.04版本
本节对应谷歌开源Tensorflow Object Detection API物体识别系统 Quick Start步骤(一): Quick Start: Jupyter notebook for of ...
- 关于对Access数据库的学习报告
学习Access数据库的报告 一.前言 一开始我对access一窍不通,甚至不知道它是干什么的,后来经过网上资料的查阅对它略有了解.microsoft office access是由微软发布的关联式数 ...