IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Codeforces Round #775 A-D -> 正文阅读

[C++知识库]Codeforces Round #775 A-D

总体来说,这场比赛题目好,但是因为很多小的优化没学到,所以C寄了一发,最后机房提前二十分钟关门,D算是寄了。

A. Game
题意:给定一个长度为n的01串,如果是连着的1可以直接走,如果是0可以跳过,当然1也可以跳过,跳过的长度即为花费,问从头走到尾如果只跳一次需要多少花费。

思路:注意读题,只能跳一次,所以只要需要跳,必然是一次性跳过所有的0,直接模拟就好了

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t,n,temp,pos1=0,pos2=0;
    for(cin>>t;t;t--)
    {
        cin>>n;
        pos1=0,pos2=0;
        for(int i=1;i<=n;i++)
        {
            cin>>temp;
            if(!temp&&!pos1)
                pos1=i;
            if(!temp)
                pos2=i;
        }
        if(pos2==0)
            cout<<0<<endl;
        else
        cout<<pos2-pos1+2<<endl;
    }
    return 0;
}

B - Game of Ball Passing
题意:n个人互相传球,每个人传球的次数已知,问他们最少用了多少个球。

思路:用最大的传球次数减去所有的,小于等于0就只用了一个球,否则就输出剩下的

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define N 1000000+100
long long a[N];
int main()
{
    int t;
    for(cin>>t;t;t--)
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>a[i];
        sort(a+1,a+n+1);
        if(a[n]==0)
        {
            cout<<0<<endl;
            continue;
        }
        for(int i=n-1;i>=1;i--)
            a[n]-=a[i];
        if(a[n]<=0)
            cout<<1<<endl;
        else
            cout<<a[n]<<endl;
    }
    return 0;
}

C - Weird Sum
题意:给定一个矩阵,每个单元格有一个数字代表颜色,求所有颜色相同的单元格任意组合的曼哈顿距离
思路:暴力,直接写个桶把所有颜色相同的装在一起,再枚举求和的时候注意用多项式的规律优化一下,不然会TLE

#include <bits/stdc++.h>
using namespace std;
#define N 1000000+100
struct node{
    long long x,y,c;
};
node a[N];
long long col[N],sum[N];
bool cmp1(node x,node y){
    return x.c<y.c;
}
bool cmp2(node x,node y){
    return x.x>y.x;
}
bool cmp3(node x,node y){
    return x.y>y.y;
}
int main()
{
   // freopen("in.txt","r",stdin);
    register int n,m,cnt=0,maxx=-1,minn=1e9;
    scanf("%d%d",&n,&m);
    for(register int i=1;i<=n;i++)
    {
        for(register int j=1;j<=m;j++)
        {
            scanf("%d",&a[++cnt].c);
            a[cnt].x=i;
            a[cnt].y=j;
            col[a[cnt].c]++;
            maxx=maxx>a[cnt].c?maxx:a[cnt].c;
            minn=minn<a[cnt].c?minn:a[cnt].c;
        }
    }
    sort(a+1,a+cnt+1,cmp1);
    for(register int i=minn;i<=maxx;i++)
        sum[i]=sum[i-1]+col[i];
    register long long ans=0;
    for(register int i=minn;i<=maxx;i++)
    {
        sort(a+sum[i-1]+1,a+sum[i]+1,cmp2);
        for(register int j=1+sum[i-1],k=sum[i]-sum[i-1]-1;j<=sum[i];k-=2,j++)
            ans+=a[j].x*(long long)k;
        sort(a+sum[i-1]+1,a+sum[i]+1,cmp3);
        for(register int j=1+sum[i-1],k=sum[i]-sum[i-1]-1;j<=sum[i];k-=2,j++)
            ans+=a[j].y*(long long)k;
    }
    cout<<ans<<endl;
    return 0;
}

D - Integral Array
正难则反
题意:给定一个数列,我们要求这个数列选取任意两个满足x<=y的数x,y(x和y可以相同),都满足y/x向下取整存在于数组中。
如果满足要求输出YES
否则输出NO

思路:我们每次分析不满足题意的情况是存在一个r不属于数列并且有y/x=r,所以我们可以枚举所有数组中不存在的数,如果对于这个不存在的数r在数组中有y/x能和r相等,那么就肯定不满足题意了。

#include <stdio.h>
#include <algorithm>
using namespace std;
#define N 1000000+100
 
int a[N];
bool vis[N];
int main()
{
    register int t,n,c;
    //freopen("in.txt","r",stdin);
    for(scanf("%d",&t);t;t--)
    {
        scanf("%d%d",&n,&c);
        for(register int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            vis[a[i]]=1;
        }
        sort(a+1,a+n+1);
        bool falg=true;
        for(register int i=1;i<=c;i++)
        {
            if(vis[i])
                continue;
            if(!falg)
                break;
            for(register int j=i;j<=c;j+=i)
            {
                register int y=j/i;
                if(!vis[y])
                    continue;
                register int pos=lower_bound(a+1,a+n+1,j)-a;
                if(pos==n+1||a[pos]>=y+j)
                    continue;
                else
                {
                    falg=false;
                    break;
                }
            }
        }
        if(falg)
            puts("YES");
        else
            puts("NO");
        for(register int i=1;i<=n;i++)
            vis[a[i]]=false;
    }
    return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:10:02  更:2022-03-08 22:10:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:17:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码