• AtCoder Regular Contest 069 D 思维,模拟 E 模拟,贪心


    AtCoder Regular Contest 069

    D - Menagerie

    题意:n只动物从1到n围成一个圈,每只动物要么是羊要么是狼。每只动物会说出一个字母,说'o'表示它两边动物种类相同,说'x'表示不同。但羊是说真话,狼是说反话。求出这n只动物的种类。

    tags:前几天做了个带权并查集的题,被自己坑了== 这题只要先假定好第1和第2只动物的种类(一共就4种情况),就可以推出所有动物种类,再看推出的第1和第2只动物种类是否和假设的矛盾即可。

    #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 = 2e5+10;
    
    int n, a[N];
    char s[N];
    int main()
    {
        scanf("%d %s", &n, s+1);
        s[n+1]=s[1], s[n+2]=s[2];
        FF(ca,0,1) FF(cb,0,1) {
            a[1]=ca, a[2]=cb;
            FF(i,2,n+1) {
                if(a[i]==0) {
                    if(s[i]=='o') a[i+1]=a[i-1];
                    else a[i+1]=a[i-1]^1;
                } else {
                    if(s[i]=='o') a[i+1]=a[i-1]^1;
                    else a[i+1]=a[i-1];
                }
            }
            if(a[1]==a[n+1] && a[2]==a[n+2]) {
                FF(i,1,n) printf("%c", a[i]==0?'S':'W');
                return 0*puts("");
            }
        }
        puts("-1");
    
        return 0;
    }
    View Code

     E - Frequency

    题意:一个数组a[],要构造出一个最小字典序序列S。有两个操作:1、在数组a[]的最大几个数里,选出标号最小的数的标号id,加入到S的末尾;2、在a[]所有数里选择一个数,使其减1。 持续这两操作直到数组a[]都为0。问最后S里1~n每个数出现的次数。

    tags:就是一个SB模拟,怎么就ZZ地没做出来呢== 排个序搞一下就行

    #include<bits/stdc++.h>
    using namespace std;
    #pragma comment(linker, "/STACK:102400000,102400000")
    #define rep(i,a,b) for (int i=a;i<=b;i++)
    #define per(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 = 2e5+10;
    
    ll ans[N];
    int n, minID;
    struct P { int v, id; }p[N];
    bool cmp(const P &a, const P &b) {
        if(a.v==b.v) return a.id>b.id;
        return a.v>b.v;
    }
    int main()
    {
        scanf("%d", &n);
        rep(i,1,n) scanf("%d", &p[i].v), p[i].id=i;
        sort(p+1, p+1+n, cmp);
        minID=INF;
        rep(i,1,n) {
            minID=min(minID, p[i].id);
            if(p[i].v!=p[i+1].v) ans[minID]+=1LL*(p[i].v-p[i+1].v)*i;
        }
        rep(i,1,n) printf("%lld
    ", ans[i]);
    
        return 0;
    }
    View Code
  • 相关阅读:
    Linux 切换用户
    Java之.jdk安装-Linux
    Java之.jdk安装-Windows
    java注解生成xml和包含CDATA问题
    Spring学习—生成图片验证码
    java学习——java按值传递和按址传递
    温水中被煮熟的程序员-人生的思考
    mysql操作sql的小技巧
    java的classLoader分析与jettty的WebAppClassLoader
    深入Spring:自定义事务管理
  • 原文地址:https://www.cnblogs.com/sbfhy/p/6420857.html
Copyright © 2020-2023  润新知