Educational Codeforces Round 17

来源:互联网 发布:天龙八部2 源码下载 编辑:程序博客网 时间:2024/06/15 20:45

Unrated所以就随便写了……结果写的有点烂……改写的没写完GG

A.

题目大意:给出一个数n(1<=n<=1e15),求n的第k小的因子(1<=k<=1e9).


分析:刚开始被n的范围吓到了,然后各种思路跑偏,最后也没什么结果,去吃了点东西回来看了看B不少人做就去做B了,做完B回来看A就知道该怎么写了orz……虽然n的范围很大,暴力枚举1~n内的每一个数显然会超时,但实际上我们只需要枚举1~n^(1/2)内的数即可,剩下的数可以由n/i得到,我们每次得到这一对数可以把他们用一个set维护,然后从头开始遍历到第k个就是答案。


代码:

#include <iostream>#include <string.h>#include <stdio.h>#include <stdlib.h>#include <math.h>#include <cstring>#include <vector>#include <list>#include <map>#include <set>#include <queue>#include <stack>#include <bitset>#include <sstream>#include <algorithm>#include <numeric>#include <functional>//#include <iomanip.h>#include <limits.h>//#include <strstrea.h>//#include <fstream.h>#define ll long long#define ull unsigned long long//#define int64 long long#define INF  0x3f3f3f3fusing namespace std;const int maxn = 1e8;ll n;int k;set<ll> s;int main() {    cin >> n >> k;    s.insert(1);    s.insert(n);    for (ll i = 2; i * i <= n; i++) {        if (n % i == 0) {            s.insert(i);            s.insert(n / i);        }    }    set<ll>::iterator it = s.begin();    if (s.size() < k) cout << -1 << endl;    else {        for (int i = 0; i < k - 1; i++) it++;        cout << *it << endl;    }    return 0;}

B.


题目大意:有a台电脑只能用usb接口鼠标,b台电脑只能用PC/2接口鼠标,c台电脑两种接口都可以用,一共m个鼠标,每个鼠标有一个花费val和接口,求最大可以安装鼠标的电脑数和最小耗费。


分析:先两种鼠标排下序,优先考虑单一接口的,然后双接口的用剩下的鼠标填起来就好了。wa了一次是因为如果两种鼠标都有剩余应当优先考虑两种鼠标中价格最小的给双接口的电脑。


代码:

#include <iostream>#include <string.h>#include <stdio.h>#include <stdlib.h>#include <math.h>#include <cstring>#include <vector>#include <list>#include <map>#include <set>#include <queue>#include <stack>#include <bitset>#include <sstream>#include <algorithm>#include <numeric>#include <functional>//#include <iomanip.h>#include <limits.h>//#include <strstrea.h>//#include <fstream.h>#define ll long long#define ull unsigned long long//#define int64 long long#define INF  0x3f3f3f3fusing namespace std;const int maxn = 1e6;int a, b, c, m;ll usb[maxn];ll pc[maxn];int uc = 0, pcc = 0;string s;int main() {    cin >> a >> b >> c >> m;    ll val;    for (int i = 0; i < m; i++) {        cin >> val >> s;        if (s[0] == 'U') usb[uc++] = val;        else pc[pcc++] = val;    }    sort(usb, usb + uc);    sort(pc, pc + pcc);    ll ans = 0;    int sum = 0;    int i = 0, j = 0;    while (a > 0 && i < uc) {        ans += usb[i];        a--;        i++;        sum++;    }    while (b > 0 && j < pcc) {        ans += pc[j];        b--;        j++;        sum++;    }    while (c > 0 && i < uc && j < pcc) {        if (usb[i] < pc[j]) {            ans += usb[i++];            sum++;            c--;        } else {            ans += pc[j++];            sum++;            c--;        }    }    while (c > 0 && i < uc) {        ans += usb[i];        i++;        c--;        sum++;    }    while (c > 0 && j < pcc) {        ans += pc[j];        j++;        c--;        sum++;    }    cout << sum << " " << ans << endl;    return 0;}

剩下的补完题再写吧orz……

0 0
原创粉丝点击