BUPT2017 springtraining(15) #3
A.签到题
#include <cstdio>
double a[] = {0.4, 0.16, 0.063, 0.025, 0.010, 0.004};
int main() {
    int n;
    double m;
    scanf("%d", &n);;
    for(int i = ;i <= n;i ++) {
        scanf("%lf", &m);
        printf("Case #%d: ", i);
        if(m >= ) puts("Too Bright");
        else if(m < 0.004) puts("Invisible");
        else for(int j = ;j < ;j ++) {
            if(m >= a[j]) {
                printf("%d\n", j + );
                break;
            }
        }
    }
    return ;
}
B.很明显的一个做法是我们把 n 个exchange 按 Ri 从小到大排序
对于每个exchage查询获得Ri的最少时间 tim = min( time[Ri] , time[max_money] )
再用 tim + Ti 尝试更新获得Vi需要的最少时间即可
最后ans = min( time[m], time[max_money] )
实现方法则是 sort + 线段树
另外一种奇特的实现方法把线段树换成了树状数组
我们可以看到查询是向后查询,修改是向前修改
而常见的树状数组多为向前查询 i -= lowbit(i),向后修改 i += lowbit(i)...
所以那个我没有看懂...或者可以倒过来?
但是我们找到了另一种思路,类似于堆优化dijkstra的思路
我们对 n 个 exchange 同上述方法排序
小根堆中元素为 pair (s, time) ,time为关键字
time表示获得 s 的最小时间
显然会有每次堆顶元素中, s 严格单增
然后我们用 last_s < Ri <= now_s 的所有 exchange 尝试进行更新即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node {
    int v, r, t;
    bool operator < (const node &a) const {
        return r < a.r;
    }
}a[];
struct Node {
    int s;
    ll tim;
    bool operator < (const Node &a) const {
        return tim > a.tim;
    }
};
int t, n, m;
priority_queue <Node> q;
int main() {
    ios::sync_with_stdio(false);
    ll ans;
    Node tmp;
    cin >> t;
    int i, st;
    for(int p = ;p <= t;p ++) {
        ans = -;
        cin >> n >> m;
        while(!q.empty()) q.pop();
        for(i = ;i <= n;i ++) cin >> a[i].v >> a[i].r >> a[i].t;
        sort(a + , a + n + );
        q.push((Node){, }), st = ;
        while(!q.empty()) {
            tmp = q.top();
            q.pop();
            if(tmp.s >= m) {
                ans = tmp.tim;
                break;
            }
            for(i = st;i <= n;i ++) {
                if(a[i].r > tmp.s) break;
                if(a[i].v <= tmp.s) continue;
                q.push((Node){a[i].v, tmp.tim + a[i].t});
            }
            st = i;
        }
        printf("Case #%d: %lld\n", p, ans);
    }
    return ;
}
C.签到题...看清题,大根堆和小根堆都合法,居然还有左大右小的 bst 也可以...
#include <iostream>
using namespace std;
int n, t, a[];
char s[][] = {"Neither", "Heap", "BST", "Both"};
int is_greater_heap() {
    for(int i = ;i *  <= n;i ++)
        if((i *  +  <= n && a[i *  + ] < a[i]) || a[i * ] < a[i]) return ;
    return ;
}
int is_less_heap() {
    for(int i = ;i *  <= n;i ++)
        if((i *  +  <= n && a[i *  + ] > a[i]) || a[i * ] > a[i]) return ;
    return ;
}
int is_greater_bst() {
    for(int i = ;i *  <= n;i ++)
        if((i *  +  <= n && a[i *  + ] < a[i]) || a[i * ] > a[i]) return ;
    return ;
}
int is_less_bst() {
    for(int i = ;i *  <= n;i ++)
        if((i *  +  <= n && a[i *  + ] > a[i]) || a[i * ] < a[i]) return ;
    return ;
}
int main() {
    ios::sync_with_stdio(false);
    cin >> t;
    for(int i = ;i <= t;i ++) {
        cin >> n;
        for(int j = ;j <= n;j ++) cin >> a[j];
        printf("Case #%d: %s\n", i, s[is_greater_heap() | is_less_heap() | is_greater_bst() | is_less_bst()]);
    }
    return ;
}
D.
E.
F.你就数对各个字母
然后看到前一个的最后 'g' 可以被下一个再用一次就行了
#include <iostream>
using namespace std;
int main() {
    ios::sync_with_stdio(false);
    int t, g, o, d, m, n, r, i, k;
    string s;
    cin >> t, getline(cin, s);
    for(int p = ;p <= t;p ++) {
        getline(cin, s);
        g = o = d = m = n = r = i = k = ;
        for(int j = ;j < s.size();j ++) {
            g += (s[j] == 'g');
            o += (s[j] == 'o');
            d += (s[j] == 'd');
            m += (s[j] == 'm');
            n += (s[j] == 'n');
            r += (s[j] == 'r');
            i += (s[j] == 'i');
            k += (s[j] == ' ');
        }
        printf("Case #%d: %d\n", p, min(min(min(g - , o / ), min(d, m)), min(min(n / , r), min(i, k))));
    }
    return ;
}
G.
H.
I.
J.
K.一个比较直观的东西是
min(A & (~B), A & B)至少能去掉 A 中一半的1对吧...所以很快就能变成0了
看到了比较适合本菜鸡的最良心的题解在这里
#include <cstdio>
typedef unsigned long long uint;
int t, n;
uint a[];
uint min(uint x, uint y){
    return x < y ? x : y;
}
uint dfs(uint k, int i) {
    if(i > n) return k;
    return min(dfs(k & a[i], i + ), dfs(k & (~a[i]), i + ));
}
int main() {
    scanf("%d", &t);
    for(int p = ;p <= t;p ++) {
        scanf("%d", &n);
        for(int i = ;i <= n;i ++)
            scanf("%llu", &a[i]);
        if(n > ) {
            printf("Case #%d: 0\n", p);
            continue;
        }
        printf("Case #%d: %llu\n", p, min(dfs(a[], ), dfs(~a[], )));
    }
    return ;
}
BUPT2017 springtraining(15) #3的更多相关文章
- BUPT2017 wintertraining(15) #3 题解
		我觉得好多套路我都不会ヘ(;´Д`ヘ) 题解拖到情人节后一天才完成,还有三场没补完,真想打死自己.( ˙-˙ ) A - 温泉旅店 UESTC - 878 题意  有n张牌,两人都可以从中拿出任意 ... 
- BUPT2017 wintertraining(15) #2 题解
		这场有点难,QAQ.补了好久(。• ︿•̀。) ,总算能写题解了(つд⊂) A. Beautiful numbers CodeForces - 55D 题意  求\([l,r](1\le l_i\l ... 
- BUPT2017 wintertraining(15) #1 题解
		拖了一周才完成的题解,抛出一个可爱的表情 (っ'-')╮ =͟͟͞͞❤️.对我来说E.F比较难,都是线段树的题,有点久没写了. A - Infinite Sequence CodeForces - 6 ... 
- BUPT2017 springtraining(16) #1 题解
		https://vjudge.net/contest/162590 A: 不难发现,当L=R时输出L,当L<R时输出2. B: 贪心得配对.1和n配 2和n-1配,对与对直接只要花1个代价就可以 ... 
- BUPT2017 wintertraining(15) #9
		下面不再说明题意了请自行读题,直接放contest链接. https://vjudge.net/contest/151607 A.考虑当火车隔k站一停时 区间长度 >= k 的纪念品一定能买到 ... 
- BUPT2017 springtraining(16) #6 ——图论
		题目链接 A.容易发现最后字符的对应都是一对一的 或者说我们没办法出现最后多对一或者一对多的情况 所以只要算出 ‘a’ - 'z' 每个字符最后对应的字符即可 #include <cstdio& ... 
- BUPT2017 springtraining(16) #4 ——基础数论
		题目在这里 A.手动打表找规律得组合数 n -= 2, m -= 2, ans = C(n, m) #include <bits/stdc++.h> using namespace std ... 
- BUPT2017 springtraining(16) #3 ——搜索与动态规划
		题目在这里啊 A.最长上升子序列,范围很小所以写了简单的O(n^2)算法 #include <iostream> #define rep(i, j, k) for(int i = j;i ... 
- BUPT2017 springtraining(16) #2 ——基础数据结构
		题目在这里 A.似乎是个并查集+??? B.10W的范围,似乎可以暴力来一发二分+sort? 但我猜正解可以O(nlogn)? C.单调队列入门题目 #include <cstdio> ] ... 
随机推荐
- 修改select默认样式
			http://www.qkzone.com/code/2015-11-26/1.html 
- POJ1061 青蛙的约会 exgcd
			这个题虽然很简单,但是有一个比较坑的地方,就是gcd不一定是1,有可能是别的数.所以不能return 1,而是return a; 题干: Description 两只青蛙在网上相识了,它们聊得很开心, ... 
- jeesite自定义主题
			jeesite cms首页太丑不够逼格,然而国内有很多高大上的皮肤供你选择,那么本文就一步一步教你如何定制自己的CMS站点视图. 1.下载 jeesite 源码,并安装配置成功 2.进入jeesite ... 
- [Swift通天遁地]三、手势与图表-(5)创建带有标题、图例、坐标轴的柱形图表
			★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ... 
- [Swift通天遁地]八、媒体与动画-(1)实现音频的播放和停止
			★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ... 
- async 函数-----------------解决异步操作隧道的亮光
			之前也学过,只是没有学好,公司现在用的都是async函数 , 所以决定把它弄懂.最近看了看阮一峰的博客,做下记录. 异步I/O不就是读取一个文件吗,干嘛要搞得这么复杂?异步编程的最高境界,就是根本不用 ... 
- BZOJ 4668 LCT
			思路: 这不是LCT裸题嘛23333 (好像并查集+按秩合并就可以搞了 我还是too young) 维护边权的话 就新加一个点 代表边 这个点想线段的两个端点连边就好了 //By SiriusRen ... 
- python之set集合及深浅拷贝
			一.知识点补充 1.1字符串的基本操作 li =["李李嘉诚", "麻花藤", "⻩黄海海峰", "刘嘉玲"] s = ... 
- 题解报告:hdu 1279 验证角谷猜想
			Problem Description 数论中有许多猜想尚未解决,其中有一个被称为“角谷猜想”的问题,该问题在五.六十年代的美国多个著名高校中曾风行一时,这个问题是这样描述的:任何一个大于一的自然数, ... 
- Objective-C——Runtime理解
			动态语言 OC是一门不折不扣的动态语言,所以它的很多机制都是动态运行时决定的.这点和C语言不一样,C语言是静态绑定,也就是编译后所有的一切都已经决定了.这一点和C语言的函数指针有些类似,很多时候函数指 ... 
