CF 378(2) C D 模拟

CF 378(2)   好坑,有时间再做一遍

CodeForces 733C

题意:n只怪物,每只重ai,一开始有给定序列a[]。问最后是否能变到x只特定序列b[],变化只能是相邻的大吃小。

题解:坑死人的题,,但不要怕去写这种题,在草稿纸上写好思路,一定要动手写。  思路:先把a[]根据b[]进行分段,再对每一段进行分析。细节太多,不自己动手写一遍根本体会不到。。

#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define FF(i,a,b) for (int i=a;i<=b;i++)
#define F(i,b,a)  for (int i=b;i>=a;i--)
#define mes(a,b)  memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
typedef long long ll;
const int N = 510;

int n, k, a[N], b[N], L[N], R[N], ans1[N], ans2[N], tot;
int main()
{
    scanf("%d", &n);
    FF(i,1,n) scanf("%d", &a[i]);
    scanf("%d", &k);
    int j, now=1;
    FF(i,1,k) {
        scanf("%d", &b[i]);
        int sum=0;
        for(j=now; j<=n; j++) {
            sum+=a[j];
            if(sum==b[i]) { L[i]=now, R[i]=j, now=j+1; break;  }
            if(sum>b[i]) { puts("NO"); return 0; }
        }
    }
    if(j!=n) { puts("NO"); return 0; }
    FF(i,1,k) {
        if(L[i]==R[i]) continue;
        int maxn=-INF, mi=-1, l;
        for(l=L[i]; l<=R[i]; l++) if(maxn<a[l]) {
            mi=-1;
            if(l-1>=L[i] && a[l-1]<a[l]) maxn=a[l], mi=l;
            if(l+1<=R[i] && a[l+1]<a[l]) maxn=a[l], mi=l;
        }
        if(mi==-1) { puts("NO"); return 0; }
        if(mi!=R[i] && a[mi]>a[mi+1]) {
            for(l=mi+1; l<=R[i]; l++) ans1[tot]=i-1+mi-L[i]+1, ans2[tot++]=1;
            for(l=mi-1; l>=L[i]; l--) ans1[tot]=i-1+l-L[i]+1+1, ans2[tot++]=-1;
        }
        else {
            ans1[tot]=i-1+mi-L[i]+1, ans2[tot++]=-1;
            for(l=mi+1; l<=R[i]; l++) ans1[tot]=i-1+mi-L[i]+1-1, ans2[tot++]=1;
            for(l=mi-2; l>=L[i]; l--) ans1[tot]=i-1+l-L[i]+1+1, ans2[tot++]=-1;
        }
    }
    puts("YES");
    FF(i,0,tot-1) {
        char ch= ans2[i]==1 ? ‘R‘ : ‘L‘;
        printf("%d %c\n", ans1[i], ch);
    }

    return 0;
}

CodeForces 733D

题意:n个长方体,可取一个,或取两个粘合,求可得最大球体的方案。

题解:这个D题,但更好做一点点。 注:还是要在草稿纸上写好思路,不要求快。   就是取最小的一条边,但两个粘合的情况要注意粘合后哪条是最小的边。

#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define FF(i,a,b) for (int i=a;i<=b;i++)
#define F(i,b,a)  for (int i=b;i>=a;i--)
#define mes(a,b)  memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define mp make_pair
typedef long long ll;
const int N = 1e5+10;

int n, x, y, z, m, mi, mj, maxn=-INF;
map<pair<int ,int >, int>A, id;
int main()
{
    scanf("%d", &n);
    FF(i,1,n) {
        scanf("%d%d%d", &x, &y, &z);
        int t1=x, t2=y, t3=z;
        x=min(t1, min(t2, t3)), z=max(t1, max(t2, t3)), y=t1+t2+t3-x-z;
        if(maxn<x) maxn=x, m=1, mi=i;
        if(A[mp(y,z)] && maxn< min(y, A[mp(y,z)]+x))
            maxn=min(y, A[mp(y,z)]+x), mi=i, mj=id[mp(y,z)], m=2;
        if(A[mp(x,y)]<z) A[mp(x,y)]=z, id[mp(x,y)]=i;
        if(A[mp(x,z)]<y) A[mp(x,z)]=y, id[mp(x,z)]=i;
        if(A[mp(y,z)]<x) A[mp(y,z)]=x, id[mp(y,z)]=i;
    }
    if(m==1) printf("1\n%d\n", mi);
    else printf("2\n%d %d\n", mi, mj);

    return 0;
}

时间: 2024-10-12 14:50:35

CF 378(2) C D 模拟的相关文章

CF #392(2) C 暴力模拟

CF #392(2)  C. Unfair Poll 题意:n行m列人,老师点k次名.点名次序,每一行都是从1到m,但行是按1,2....(n-1),n,(n-1),(n-2)...1,2,3....(n-1),n.....求点完k次名后被点的最多的次数和最少的次数,以及给定的(x,y)被点次数. 总结:有点麻烦,但还是很好找规律,只是fst了,有时间再写一遍...还是太菜了,连着三场CF都是fst #include<bits/stdc++.h> using namespace std; #p

CF 2A Winner(STL+模拟)

题目链接:http://codeforces.com/contest/2/problem/A 题目: The winner of the card game popular in Berland "Berlogging" is determined according to the following rules. If at the end of the game there is only one player with the maximum number of points,

CF 888C K-Dominant Character(模拟)

题目链接:http://codeforces.com/problemset/problem/888/C 题目: You are given a string s consisting of lowercase Latin letters. Character c is called k-dominant iff each substring of s with length at least k contains this character c. You have to find minimu

你会用::before、::after吗

::before和::after伪元素的用法 一.介绍 css3为了区分伪类和伪元素,伪元素采用双冒号写法. 常见伪类——:hover,:link,:active,:target,:not(),:focus. 常见伪元素——::first-letter,::first-line,::before,::after,::selection. ::before和::after下特有的content,用于在css渲染中向元素逻辑上的头部或尾部添加内容. 这些添加不会出现在DOM中,不会改变文档内容,不可

关于css中after和before伪类的用法

::before和::after伪元素的用法 一.介绍 css3为了区分伪类和伪元素,伪元素采用双冒号写法. 常见伪类——:hover,:link,:active,:target,:not(),:focus. 常见伪元素——::first-letter,::first-line,::before,::after,::selection. ::before和::after下特有的content,用于在css渲染中向元素逻辑上的头部或尾部添加内容. 这些添加不会出现在DOM中,不会改变文档内容,不可

两个超大数相乘

需要注意的都在代码注释里,自己看吧,欢迎讨论.另外,此代码调试通过 #include<iostream> #include<string> #include<cmath> using namespace std; //模拟手工加法 string add(string str1, string str2) { int i; string str; int len_str1 = str1.length(); int len_str2 = str2.length(); int

::before和::after伪元素的用法

一.介绍 css3为了区分伪类和伪元素,伪元素采用双冒号写法. 常见伪类——:hover,:link,:active,:target,:not(),:focus. 常见伪元素——::first-letter,::first-line,::before,::after,::selection. ::before和::after下特有的content,用于在css渲染中向元素逻辑上的头部或尾部添加内容. 这些添加不会出现在DOM中,不会改变文档内容,不可复制,仅仅是在css渲染层加入. 所以不要用:

转::before和::after伪元素的用法

一.介绍 css3为了区分伪类和伪元素,伪元素采用双冒号写法. 常见伪类--:hover,:link,:active,:target,:not(),:focus. 常见伪元素--::first-letter,::first-line,::before,::after,::selection. ::before和::after下特有的content,用于在css渲染中向元素逻辑上的头部或尾部添加内容. 这些添加不会出现在DOM中,不会改变文档内容,不可复制,仅仅是在css渲染层加入. 所以不要用:

HTML:::before和::after伪元素的用法

随笔 - 366  文章 - 0  评论 - 392 一.介绍 css3为了区分伪类和伪元素,伪元素采用双冒号写法. 常见伪类——:hover,:link,:active,:target,:not(),:focus. 常见伪元素——::first-letter,::first-line,::before,::after,::selection. ::before和::after下特有的content,用于在css渲染中向元素逻辑上的头部或尾部添加内容. 这些添加不会出现在DOM中,不会改变文档内