Comet OJ - 2019国庆欢乐赛

https://www.cometoj.com/contest/68/problem/A

enmmmm 看到 许多的 爆 ll  的老故事

#include<bits/stdc++.h>
using namespace std;

int main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int t,a,b,c,d;
    cin >> t;
    while(t--) {
        cin >> a >> b >> c >> d;
        if((a < 0 && c > 0) && (b < 0 && d > 0)) cout << "8\n";
        else if((a < 0 && c > 0) || (b < 0 && d > 0)) cout << "6\n";
        else cout << "5\n";
    }
    return 0;
}

https://www.cometoj.com/contest/68/problem/B

从小到大排个序  a1 a2 a3 a4 a5, 如果 sum-a5 <= a5 那么全部都是有缘人  结果为 sum-a5

否则  结果为 sum/2,  相当于贪心每次拿最大的俩个数减1直到和小于2   可用数学归纳法证明

  if  sum == 2 || 3, result  = sum/2

   假设 sum > 3 && sum为偶数, sum -A(max) > A(max)
  sum-A(max)-1 > A‘(max) 依旧成立, 故假设成立

#include<bits/stdc++.h>
using namespace std;

int main(){
    int a[6] = {}; long long ans = 0;
    for(int i = 0; i < 5; i++) cin >> a[i], ans += a[i];
    sort(a, a+5);
    if(ans-a[4] > a[4]) cout<< ans/2;
    else cout<< ans-a[4];
    return 0;
}
/*
1 1 1 1 1
2
*/

https://www.cometoj.com/contest/68/problem/C

直接枚举 左边的房子 用双指针求每个房子的对门右边房子数

也可以 用lower_bound  和  upper_bound 来缩减代码

/*
3 3
1 3
3 4
5 6
2 4
4 5
5 7

5
*/
#include<bits/stdc++.h>

using namespace std;
#define _for(i,a,b) for(int i = (a); i < (b); i++)
#define _rep(i,a,b) for(int i = (a); i <= (b); i++)
#define l first
#define r second
const int N = 2e5+100;
int n,m;
pair<int, int > t[N], s[N];
int main(){
    ios_base::sync_with_stdio(false); cin.tie(0);
    cin>> n >> m;
    _rep(i,1,n) cin >> t[i].l >> t[i].r;
    _rep(i,1,m) cin >> s[i].l >> s[i].r;
    int L = 1, R = 1, res = 0;
    _rep(i,1,n){
        while(L <= m && s[L].r < t[i].l) L++;
        while(R <= m && s[R].l <= t[i].r) R++;
        res += R-L;
    }
    cout << res << endl;
    return 0;
}
//
#include<bits/stdc++.h>

using namespace std;
#define _for(i,a,b) for(int i = (a); i < (b); i++)
#define _rep(i,a,b) for(int i = (a); i <= (b); i++)
const int N = 2e5+100;
int xl[N],xr[N],yl[N],yr[N];
int main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int n,m;
    cin >> n >> m;
    _rep(i,1,n) cin >> xl[i] >> xr[i];
    _rep(i,1,m) cin >> yl[i] >> yr[i];
    int res = 0;
    _rep(i,1,n)
    res += (upper_bound(yl+1, yl+m+1, xr[i])-yl)
         - (lower_bound(yr+1, yr+m+1, xl[i])-yr);
    cout << res << endl;
    return 0;
}

 

https://www.cometoj.com/contest/68/problem/D1?problem_id=3936

n <=  1e5, 所以可以直接模拟  用前缀和 二分答案

// 1
// 5 3 2 7
// 1 1 1
// output  11
#include<bits/stdc++.h>

using namespace std;
#define _for(i,a,b) for(int i = (a); i < (b); i++)
#define _rep(i,a,b) for(int i = (a); i <= (b); i++)
#define ll long long
const int N = 2e5+100;
int a[N],pre[N];
int main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int t; cin >> t;
    while(t--){
        ll n,m,k,d,res = 0, sum = 0;
        cin >> n >> m >> k >> d;
        _rep(i,1,m) cin >> a[i], sum += a[i];
        if(d >= n*sum) { cout << n*(m+k) << endl; continue;}
        sort(a+1, a+1+m); pre[0] = 0;
        _rep(i,1,m) pre[i] = pre[i-1]+a[i];// init 若是 +=,须得初始化
        //_for(i,0,m) cout << pre[i] << "  " ; cout << "\n";
        _rep(i,0,n)
        {//枚举做完0~n张卷子剩下时间能做的题目
            ll time = d - i*sum,
            score = i*(m+k), ans = 0;
            if(time < 0) break;
            ll l = 0, r = m;
            while(l <= r){
                ll mid = (l+r)>>1;
                if(pre[mid]*(n-i) <= time) ans = mid, l = mid+1;
                else  r = mid-1;
            }
            score += (n-i)*(ans) + (time-pre[ans]*(n-i))/a[ans+1];
            res = max(res, score);
        }
        cout << res << endl;
    }
    return 0;
}

https://www.cometoj.com/contest/68/problem/D2?problem_id=3937

由于  Q  5e4  n  1e9 故直接枚举n 不行, 但是 m 1e5 没变 所以可以试着枚举  m,
 假设最优做到 第 P 道题时间耗尽, 有许多种做卷子的方法到 第P 道题目, 把这些方法的已经做了的卷子张数为一个区间 
 在这个区间的横轴中 得分的纵轴是一个一次函数(一条直线), 故极大值在两端 , 通过枚举题目算出相应的极值  取最大值即可(enmmmmmm 大体懂了, 具体代码细节还是不懂)

#include <bits/stdc++.h>
using namespace std;

const int Maxn = 500005;
int m, k, res, T, a[Maxn];
long long n, ans, now, D;
int main()
{
    scanf("%d", &T);
    while (T--)
    {
        now = 0, ans = 0, res = 0;
        scanf("%lld%d%d%lld", &n, &m, &k, &D);
        for (int i = 1; i <= m; i++)
            scanf("%d", &a[i]), now += a[i];
        sort(a + 1, a + 1 + m);
        for (int i = 1; i <= m; i++)
        {
            int all = min(n, D / now);
            ans = max(ans, all * (long long) (m + k - res) + min((n - all) * a[i], D - all * now) / a[i] + n * res);
            if (D - a[i] * n < 0)
            {
                ans = max(ans, D / a[i] + n * res);
                break;
            }
            if (i != m)
            {
                int tmp = ceil((D - a[i] * n) / (double) (now - a[i]));
                if (D - tmp * now >= 0)
                    ans = max(ans, (long long) tmp * (m + k - res) + min(n * a[i], D - tmp * now) / a[i] + n * res);
            }
            now -= a[i];
            D -= a[i] * n;
            res++;
        }
        printf("%lld\n", ans);
    }
    return 0;
}

https://www.cometoj.com/contest/68/problem/E?problem_id=3938

首先判断: 当 k 大于 n 时显然不成立, 其次 当 k 为 奇数时, 一个无向图中有 奇数个点的边为奇数也不成立(草稿纸上画了下发现是的, 具体没有严格证明)

当k成立时,考虑最多边数 所以直接无向图满边删最少边即可   若 n 为奇数 ,每个点连接的边都是n-1 (偶数条),只需要删去 k/2条边既可以产生k个点为奇数边
                             同理, 当 n 为偶数时,  每个点连接的边为n-1(奇数条), 只需要保留k个点不删边,删去 (n-k)/2条边既可产生 n-k个点为偶数边 
 略略有些拗口,不过在草纸上画一画便知

#include <bits/stdc++.h>
using namespace std;
#define _for(i,a,b) for(int i = (a); i < (b); i++)
#define _rep(i,a,b) for(int i = (a); i <= (b); i++)

int main(){
    ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    long long t,n,k;
    cin >> t;
    while(t--)
    {
        cin >> n >> k;  //cout<< n <<k <<" \n";
        if(k>n || k&1) cout<< "renrendoushijwj\n";
        else
        {
            if(n&1) cout<< n*(n-1)/2-k/2 << endl;
            else cout << n*(n-1)/2-(n-k)/2 << endl;
        }
    }
    return 0;
}
/*
4
7 8
7 4
3 1
5 4
样例输出 1
renrendoushijwj
19
renrendoushijwj
8
*/

原文地址:https://www.cnblogs.com/163467wyj/p/11675148.html

时间: 2024-08-30 11:23:13

Comet OJ - 2019国庆欢乐赛的相关文章

Comet OJ - 2019 六一欢乐赛

传送门 #A: 思路:等差数列求和,看成俩次1+2+…+ n,多加的n减去,所以 ans = n*(n+1) - n. AC代码: 1 #include<iostream> 2 #include<algorithm> 3 #include<string> 4 using namespace std; 5 int main() 6 { 7 int n; 8 while(cin >> n) 9 { 10 cout << n*(n+1) - n <

欢乐赛解题报告

~~一场不欢乐的欢乐赛 时间分配::T1做的时候还可以,大约三十分钟写了个深搜(鬼知道我为啥不用广搜,大概是因为快半个月没写了)写完后去研究第二题,刚开始以为是贪心,很快写了出来,但是自己推了一会举出了反例.于是自己想了很多方法,但是都是基于贪心,写了一个多小时,写炸了,没办法又改成了贪心.第三题并不会,然后搜索大法过了一个点,(输出-1也是一个点) 整体感觉::还是太弱,T1是会的,但是还是没做对,大概是独立做题少的缘故吧,平常做题都没有思考太多时间.T2贪心T3暴力,貌似自己啥都不会.到现在

综合-某假期欢乐赛 (Apri, 2018)

假期欢乐赛,确实挺轻松的,被逼迫写了题解. A.推数按列观察,有的列有多个格子,看起来好复杂啊,先放一放.按行观察,黑色格子在 i 行 j 列:当 i 是奇数,对应数字第 i 位是 j-1当 i 是偶数,对应数字第 i 位是 9-j B.体重某位同学不是中间体重的充要条件是,比他重的人数 >= mid 或 比他轻的人数 >= midx 比 y 重,则 x, y 有单向连通关系,G[x][y] = true .比 y 重的人数就是满足 G[i][y] = true 的 i 的数量.比 y 轻的人

Comet OJ - Contest #5

Comet OJ - Contest #5 总有一天,我会拿掉给\(dyj\)的小裙子的. A 显然 \(ans = min(cnt_1/3,cnt_4/2,cnt5)\) B 我们可以感性理解一下,最大的满足条件的\(x\)不会太大 因为当\(x\)越来越大时\(f(x)\)的增长速度比\(x\)的增长速度慢得多 其实可以证明,最大的满足的\(x\)不会超过\(100\) 因为没有任何一个三位数的各位之和大于等于\(50\) 所以我们就直接预处理\(1-99\)所有的合法的 暴力枚举即可 其实

符文能量(Comet OJ - Contest #8)

给Comet OJ打个小广告,挺好用的,比较简洁,给人感觉很好用 Contest #8是我打的第一场本oj比赛,很遗憾A了前两道傻逼题就没思路了,然后就不打算打了....... https://www.cometoj.com/contest/58/problem/C?problem_id=2760 怎么做啊完全不会啊我那么菜,虽然看到是dp但嫌太麻烦就放弃了: 靠后仔细想了想原来这道题很简单: 结构体node e[];储存ai,bi值(当然你用数组我也不拦着),因为合并的方式很特殊,可以不管合并

Comet OJ - Contest #10 B

Comet OJ - Contest #10 B 沉鱼落雁 思维题 题意 : 每个数字最多重复出现三次,有n给数字,让你尽可能的使得相同数字之间的最小距离尽可能大 思路 :分三种情况套路 设 a b c 分别代表出现 一次, 两次, 三次 数字的个数 所有元素至多出现一次,答案为 n,题目规定 所有元素至多出现两次, 例如 1 1 2,可以排列成 1 2 1,所以,答案为 1 例如 1 1 2 2 3,可以排列成 1 2 3 1 2,所有 答案为 2 思考后得出,应该尽可能的把 b 个出现两次的

2019徐州网络赛 XKC&#39;s basketball team 线段树

网址:https://nanti.jisuanke.com/t/41387 题意: 大家好,我是训练时长两年半的个人练习生蔡徐坤,我的爱好是唱,跳,rap,篮球. 给出一段长度为$n,(n \leq 1e5)$的序列,对每一个数,求出它和它后面比它大$m$的数中间夹着的数的数量,没有输出$-1$. 题解: 直接建线段树,维护最大值,然后查询时对第$i$个数,搜索区间$[i,n]$之中大于$num[i]+m$的值的位置的最大值,具体操作是先限定区间,然后求出所有合法位置,取最大值,如果搜索不到则返

ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval

ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询问子区间中某个值域的数的个数,连续的相同数字只记为一个.(即统计数字段的个数) 2 L R x y 数据范围: 1 ≤ n,m ≤ 2×10^5 1 ≤ a[i] ≤ n 解题思路: 连续重复的数字只记一次.所以考虑将每个数字段除第一个出现外的数字都删去(记为0).在读入操作的时候暴力模拟,同时维护

[CCPC-Wannafly &amp; Comet OJ 夏季欢乐赛(2019)]飞行棋

题目链接:https://www.cometoj.com/contest/59/problem/E?problem_id=2714 求期望并且一堆转移基本上就是期望dp了(叉腰 照常的设dp[i]表示i位置到n位置的期望步数.则我们所求的是dp[0]. 初始化dp[n]=0,因为n到n的期望为0. 之后先讨论下i为n-1到n-k的时候. 我们可以列出转移方程(随便写几个 $dp[n-1]=\tfrac{1}{k}*(dp[n]+dp[n-1]+dp[n-2]+\cdot \cdot \cdot