ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final)

2020-11-03 21:00:52  阅读:181  来源: 互联网

标签:based 题意 Cup int 外卖 VK long 数组 define


A Kids Seating

题意:有n个小朋友,有4 * n把编号1~4 * n的椅子,每个小朋友不能坐在编号gcd==1的位置

思路:输出2 * n~4 * n之间的n个偶数

B Saving the City

题意:给一串01字符,1表示地雷,现在有两个费用,安置地雷a元(把0变成1),引爆地雷b元,地雷爆发会导致相邻的所有地雷爆炸,问最少输出多少钱

思路:找两个1联通块中间的0的个数num,求num * b+a和2 * a的大小,小的话就是加上一个num * b-a,每个1的联通块都要+a

#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define lson(x) x<<1
#define rson(x) x<<1|1
using namespace std;
const int N=1e5+10;
int a,b;
char s[N];
int zhi[N];
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&a,&b);
        scanf("%s",s);
        int l=strlen(s);
        int sum=0,num1=0,num0=0;
        int i=0;
        s[l]='0';
        for(i=0;i<l;i++){
            if(s[i]=='1'){
                break;
            }
        }
        int cnt=0;
        for(;i<l;i++){
            if(s[i]=='1'&&s[i+1]=='0'){
                zhi[cnt++]=num1+1;num1=0;
            }
            else if(s[i]=='0'&&s[i+1]=='1'){
                zhi[cnt++]=num0+1;num0=0;
            }
            else if(s[i]=='1'&&s[i+1]=='1'){
                num1++;
            }
            else{
                num0++;
            }
        }
        for(int i=0;i<cnt;i++){
            if(i&1 && i!=cnt-1){
                if(zhi[i]*b+a<2*a){
                    sum+=(zhi[i]*b-a);
                }
            }
            else{
                sum+=a;
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

C The Delivery Dilemma

题意:你有n个菜,可以选择叫外卖去拿外卖送家里和去店拿外卖。外卖去拿的外卖算最大的,自己去店里拿需要求和,问你拿完这个n个菜,最少时间是多少

思路:按照叫外卖从小到大排序,自己去拿前缀和,然后o(n)方法比较即可。

#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define lson(x) x<<1
#define rson(x) x<<1|1
using namespace std;
const int N=2e5+10;
int n;
struct node{
    int a,b;
    friend bool operator<(const node a,const node b){
        if(a.a==b.a){
            return a.b<b.b;
        }
        return a.a<b.a;
    }
}a[N];
ll ans[N];
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i].a);
        }
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i].b);
        }
        sort(a+1,a+n+1);
        ans[0]=0;
        for(int i=1;i<=n;i++){
            ans[i]=a[i].b+ans[i-1];
        }
        ll mix=1e15;
        for(int i=1;i<=n;i++){
            mix=min(mix,max((ll)a[i].a,ans[n]-ans[i]));
        }
        mix=min(mix,ans[n]);//特判全部自己拿的情况
        printf("%lld\n",mix);
    }
    return 0;
}

D Extreme Subtraction

题意:给你一个n长度的数组,问有两种操作,选择一个k,1 ~ k下标数组值-1或者k ~ n下标数组值,问能不能使得数组全部为0,能输出yes,不能no

思路:从前算后面能否形成递减序列,或者从后算前面能否形成递增序列

给wa的盆友两个样例

2
6
5 3 5 2 4 3
6
5 3 5 3 4 3

yes
no
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define lson(x) x<<1
#define rson(x) x<<1|1
using namespace std;
const int N=3e4+10;
int n;
int a[N],b[N],c[N];
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        int f=1;
        int ans=0,minl=1e9;
	for(int i=n;i>=1;i--){
	      a[i]-=ans;
	      if(a[i]<0) f=0,break;
	      if(a[i]<=minl) minl=a[i];
	      else ans+=(a[i]-minl);
	}
        if(f)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

E 留坑待补

F Identify the Operations

题意:给你n,m长度的两个数组(分为a,b),某人得到了长度为n的数组(1~n无序排列的数组),有m个操作,删除一个n长度中的一个数字,把这个数字的前一个或者后一个(第一位和最后一位只能选一个),按照操作顺序放进另一个数组里,问有多少种情况能的到m长度的数组,答案取模

思路:标记a组数字在数组的位置,用pos数组存在b组每个数在a组的位置,并存进map里。for一遍,如果这个点的前、后下标在map里出现的则答案为0,如果这个点只出现过前或者后 * 1,都没出现过则 * 2,特判一下第一个和最后一个。然后把这个点从map中删除

#include<bits/stdc++.h>
using namespace std;
#define mod 998244353
#define ll long long
const int N=2e5+10;
int a[N],b[N],pos[N],cnt[N];
int n,m;
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&m);
        map<int,int>mp;
        for(int i=0;i<n;i++)scanf("%d",&a[i]),pos[a[i]]=i;
        for(int i=0;i<m;i++)scanf("%d",&b[i]),cnt[i]=pos[b[i]],mp[pos[b[i]]]++;
        ll ans=1;
        for(int i=0;i<m;i++){
            if(cnt[i]==0){
                if(mp[1]){ans=0;}
                mp[0]--;
            }
            else if(cnt[i]==n-1){
                if(mp[n-2]){ans=0;}
                mp[n-1]--;
            }
            else{
                ll k=2;
                if(mp[cnt[i]-1])k--;
                if(mp[cnt[i]+1])k--;
                ans*=k;ans%=mod;
                mp[cnt[i]]--;
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}

老年人了,要早睡早起(偷懒),于是开了模拟去做,做完这套感觉就是,div2就这???感觉在写div3一样 算了模拟赛卡了D,赛后看了F,想不出好方法,模拟了一遍居然AC了!

多努力才能少打铁,锻炼自己的心态也很重要。希望别留遗憾吧

标签:based,题意,Cup,int,外卖,VK,long,数组,define
来源: https://www.cnblogs.com/luoyugongxi/p/13922519.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有