首页 > 其他分享 >SMU Summer 2023 Contest Round 3

SMU Summer 2023 Contest Round 3

时间:2023-07-14 18:34:33浏览次数:37  
标签:Summer cout Contest int SMU cin ans tie sum

A. Curriculum Vitae

题意:给出一串01序列,可以删除任意个元素,使得1后面没有0

思路:枚举01分界点,使得统计前面0的个数和后面1的个数,取最大值。

点击查看代码

#include<bits/stdc++.h>
using namespace std;
 
int a[110];
 
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,ans = 1;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=n;i++){  //01分界点
        int temp = 0;
        for(int j=1;j<=i;j++){
            if(!a[j]) temp++;
        }
        for(int j=i;j<=n;j++){
            if(a[j]==1) temp++;
        }
        ans = max(ans,temp);
    }
    cout<<ans<<'\n';
    

B. Math Show

题意:有n个相同的任务,每个任务含有k个子任务,解决每个任务要花费ti时间,每完成一子任务会加一分,每完成一个完整的任务会额外加一分,问:在m时间内最多能得多少分?

思路:先对子任务完成时间排序,枚举完成完整任务的个数,再用剩余时间完成每n个1到k-1任务。

点击查看代码
#include<bits/stdc++.h>
using namespace std;

#define int long long

int a[610],sum,ans;

signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,k,m;
    cin>>n>>k>>m;
    for(int i=1;i<=k;i++)
        cin>>a[i],sum += a[i];
    sort(a+1,a+1+k);
    int cnt;
    if(m/sum>=n) cnt = n;
    else cnt = m/sum;
    for(int i=0;i<=cnt;i++){
        int temp = 0;
        int flag = m - i * sum;
        for(int j=1;j<k;j++){
            for(int k=1;k<=n-i;k++){
                flag -= a[j];
                if(flag>=0) temp+=1;
                else break;
            }
            if(flag<=0) break;
        }
        temp += (k + 1) * i;
        ans = max(ans,temp);
    }
    cout<<ans<<'\n';
    return 0;
}

C. Four Segments

题意:给出一段数组,求三个分界点d1,d2,d3,得到四段数字和sum1,sum2,sum3,sum4,ans = sum1 + sum2 - sum3 - sum4, 求ans最大值

思路:求前缀和,枚举d1,d3,在d1,d2间前缀和最小的点作为d2,取最值。

点击查看代码
#include <bits/stdc++.h>
using namespace std;

#define ll long long;

const int N = 1e6 + 10;
int n, m, k, d1, d2, d3;
ll sum[N];

ll cal(int l, int r) {
    return sum[r - 1] - sum[l - 1];
}

int main() {
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);

    cin >> n;
    for (int i = 1; i <= n; ++i) {
        cin >> sum[i];
        sum[i] += sum[i - 1];
    }

    ll ans = -(1ll << 60);

    for (int i = 0; i <= n; ++i) {
        ll temp = sum[i];
        int pos = i;
        for (int j = i; j <= n; ++j) {
            if (sum[j] < temp) {
                pos = j;
                temp = sum[j];
            }
            ll Sum = cal(1, i + 1) - cal(i + 1, pos + 1) + cal(pos + 1, j + 1) - cal(j + 1, n);
            if (Sum >= ans) {
                d1 = i;
                d2 = pos;
                d3 = j;
                ans = Sum;
            }

        }
    }
    cout<<d1<<" "<<d2<<" "<<d3<<'\n';
    return 0;
}

D. Monitor

题意:有q个像素在坐标x,y,在时间t后损坏,当损坏的像素组成k*k的正方形时显示器无法工作,求这一时间的最小值,

思路:二分彻底损坏时间,每个损坏的像素记录其为1,求损坏的像素前缀和,枚举i,j为右下角的边长为k的正方形,前缀和为k*k时该时间符合条件。

点击查看代码
#include<bits/stdc++.h>
using namespace std;

int n,m,k,q,ans=1e9+610,sum[610][610];
struct node{
    int x,y,c;
}p[250610];

bool check(int mid){
    memset(sum,0,sizeof sum);
    for(int i=1;i<=q;i++)
        if(p[i].c<=mid)
            sum[p[i].x][p[i].y] = 1;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            sum[i][j] += sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1];
            if(i>=k&&j>=k&&sum[i][j]-sum[i-k][j]-sum[i][j-k]+sum[i-k][j-k]==k*k)
                return 1;
        }
    return 0;
}

int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n>>m>>k>>q;
    int maxn = 0;
    for(int i=1;i<=q;i++){
        int a,b,c;
        cin>>a>>b>>c;
        p[i] = {a,b,c};
        maxn = max(maxn,p[i].c);
    }
    int l = -1, r = maxn+1;
    while(l+1<r){
        int mid = l + r >> 1;
        if(check(mid)){
            r = mid;
            ans = min(ans,mid);
        }else l = mid;
    }
    if(ans == 1e9+610) cout<<-1<<'\n';
    else cout<<ans<<'\n';
    return 0;
}

标签:Summer,cout,Contest,int,SMU,cin,ans,tie,sum
From: https://www.cnblogs.com/kingqiao/p/17554732.html

相关文章

  • AtCoder Beginner Contest 294
    A-Filter#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongint32_tmain(){ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);intn;cin>>n;for(intx;n;n--){cin>&......
  • AtCoder Beginner Contest 309 - D(最短路)
    目录D-AddOneEdge法一:dijkstra法二:BFS+队列题目传送门:abc309前面的简单题就不放了D-AddOneEdge题意:给你一个无向图图,分为两个连通块,一个顶点数为n1(1~n1),一个顶点数为n2(n1+1~n1+n2),图中共有m条边。如果现在在两个连通块之间连接一条边,那么顶点1与顶点n1+n2......
  • SMU Summer 2023 Contest Round 1
    A.TheContest题意:要做n道题,每道题花费时间a[i],但是只有几个时间段可以提交,问最早什么时间可以完成。思路:直接计算做完全部的题目所花费的时间,然后找到可以提交的时间段,和左端取最大值,就能得出结果。点击查看代码#include<bits/stdc++.h>usingnamespacestd;constint......
  • AtCoder Beginner Contest 162
    AtCoderBeginnerContest162ABCD全暴力E数学题看不懂,感性理解F线性dp,非常基础我不会,寄E-SumofgcdofTuples(Hard)看了题解发现好多做法都是推一堆式子,我实在看不懂(卷积莫反啥啥的呜呜呜)然后看见这个感觉比较好感性理解:(来自洛谷题解)#include<bits/stdc++.h>#def......
  • Atcoder Regular Contest 114 F - Permutation Division
    显然分成\(k\)段以后,最大化形成的排列的字典序的策略是将所有段按第一个元素的大小降序排列。由于最终排列的字典序肯定\(\ge\)原排列的字典序,因此我们考虑最大化最终排列与原排列的LCP,这部分就考虑二分答案,记\(dp_i\)表示以\(p_1\)开始\(p_i\)结尾的LDS的长度,那么......
  • AtCoder Regular Contest 164 A~C
    A题都没做出来(被自已菜晕A.TernaryDecompositionA-TernaryDecomposition(atcoder.jp)题意给定一个正整数\(N\),问是否存在\(K\)个整数,使得\(N=3^{m_1}+3^{m_2}+...+3^{m_k}\)思路首先对于一个正整数\(N\),最多有\(N\)个整数使得正式成立,即\(m_i\)全为0。再对\(N\)进行三......
  • SMU Summer 2023 Contest Round 3
    SMUSummer2023ContestRound3A.CurriculumVitae题意就是要求\(1\)后面不能有\(0\)的情况下的子序列最长长度,也就是求一个最长不下降子序列,不过由于这是个\(01\)序列,也可以分别做一个前缀和求出\(0\)的数量,后缀和求\(1\)的数量,最后跑一遍循环,找一个最大值即可,这里......
  • 【DP】DMOPC '21 Contest 8 P5 - Tree Building
    ProblemLink给定\(n,m\)和一个长为\(m\)的代价序列,对于一棵\(n\)个节点,每个节点度数不超过\(m\)的树,定义它的代价为\(\sum\limits_{i=1}^na_{deg_i}\)。求代价最小的树的代价。\(n\le10^9,m\le3000,1\lea_i\le10^9\)。首先一眼变成选出\(n\)个\(a\)的和为......
  • AtCoder Beginner Contest 161
    AtCoderBeginnerContest161https://atcoder.jp/contests/abc161这套不算难,但是sb我还是写不出来是为什么呢F是个妙妙题C-ReplacingIntegerWA了一次所以放上来#include<bits/stdc++.h>#definelllonglongusingnamespacestd;intmain(){lla,b;c......
  • AtCoder Grand Contest 012 D Colorful Balls
    洛谷传送门AtCoder传送门不错的题。bxEnder32k。我们发现交换有传递性,那么我们能交换就连边,答案是\(\prod\frac{(sz)!}{\prodc_i!}\),其中\(sz\)为连通块大小,\(c_i\)为这个连通块中第\(i\)种颜色出现次数。于是我们得到了一个\(O(n^2)\)的做法。发现很多遍是无用的......