zoukankan      html  css  js  c++  java
  • SICNU 2018 Summer Training #6

      这套题还是比较基础的。

      首先b题是队友a的,我只是刚读懂题,如果没读错的话,应该就是匹配字符串,如果有一个happiness就输出yes,且输出匹配的位置和下一个位置就行,如果没有happiness就随便输出两个位置就行,如果有两个以上的,就输出no

      附上队友的代码

    #include <iostream>
    #include <map>
    #include <set>
    #include <string>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <queue>
    using namespace std;
    const int maxn=2e5+10;
    char s[maxn];
    char t[maxn]={0,'h','a','p','p','i','n','e','s','s'};
    int len;
    
    bool judge(int addr){
        for(int i=1;i<=9;i++)
            {
                if(s[i+addr-1]!=t[i]) return 0;
            }
        
        return 1;
    }
    int find(){
        for(int i=1;i<=len;i++)
            {
                if(judge(i))
                    {
                        return i;
                    }
            }
            
        return 0;
    }
    int main(){
        scanf("%s",s+1);
        len=strlen(s+1);
        int t1=find();
        if(!t1)
            {
                swap(s[1],s[2]);
                int tmp=find();
                if(!tmp) printf("YES
    1 2
    ");
                else printf("YES
    1 3
    ");
            
        }
        else if(t1)
            {
                s[t1]=1;
                int t2=find();
                if(!t2) printf("YES
    %d %d
    ",t1,t1+1);
                else
                    {
                        s[t2]=1;
                        int t3=find();
                        if(!t3) printf("YES
    %d %d
    ",t1,t2+1);
                        else printf("NO
    ");
                    }
            }
    
        return 0;
    }

    c题水题,签到,但是还是wa了2次,没考虑情况全

    就只需要假设不知道颜色的球的颜色为红或者绿就行了

    #include <iostream>
    using namespace std;
    int main(){
        int a,b,c;
        int n,m;
         cin>>a>>b>>c>>n>>m;
         if(a+c>n&&b+c>m) cout<<min(n,m)<<endl;
         else if(a+c>n&&b+c<=m) cout<<n<<endl;
         else if(a+c<=n&&b+c>m) cout<<m<<endl;
         else if(a+c<=n&&b+c<=m) cout<<a+b+c<<endl;
        return 0;
    }

    D题想了挺久的,但其实方法还是挺简单的,就是求这个序列的所有元素的最大公约数,只要是这个公约数的倍数,就可以通过这个序列的元素进行表示(莫名wa了一次然后改了long long)

    #include <iostream>
    #include <map>
    #include <algorithm>
    using namespace std;
    int gcd(int a,int b)
    {
        return (b>0)?gcd(b,a%b):a;
    }
    
    int main(){
        int n,m;
        long long num[200005];
        cin>>n>>m;
        for(int i=0;i<n;i++) cin>>num[i];
        long long t=num[0];
        for(int i=1;i<n;i++){
            t=gcd(t,num[i]);
        }
        if(m%t==0||m==0) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
        return 0;
    }

    f题思路和题意都挺简单的,就是一开始如果对每次操作都对字符串添加前缀的话,会MLE,所以只能记录下每次的操作,然后找到与第一个人相关的所有元素形成链,如果循环输出前缀,最后输出链末尾的人的名字

    #include <iostream>
    #include <map>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    int gcd(int a,int b)
    {
        return (b>0)?gcd(b,a%b):a;
    }
        string s[200005];
        int num[200005];
        int flag[200005];
    int main(){
        int n,m;
        memset(num,0,sizeof(num));
        cin>>n;
        for(int i=1;i<=n;i++) cin>>s[i];
        cin>>m;
        int q,w;
        for(int i=0;i<m;i++){
            cin>>q>>w;
            num[q]=num[w]+1;
            s[q]=s[w];
        }
        if(num[1]==0) cout<<s[1]<<endl;
        else {
            string ss;
            for(int i=0;i<num[1];i++) cout<<"I_love_";
            cout<<s[1]<<endl;
        }
        return 0;
    }

    L题吃鸡,就是贪心就行了,将杀人数的和与人数进行比较,判断yes or no ,然后从后向前找,如果杀人数大于0的,就每次输出这个以及最后一个人,慢慢向前增加

    唯一要注意的是杀人数的和需要用long long 存,以及全场没人杀人的情况。

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <set>
    #include <map>
    #include <queue>
    #include <cstring>
    using namespace std;
        int num[200005];
        int q[200005],w[200005];
    int main()
    {
        int n;
        long long m=0;
        int t=1000000;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&num[i]);
            if(num[i]==0) t=min(t,i-1);
            m+=num[i];
        }
        if(m>=n) printf("NO
    ");
        else{
            printf("YES
    ");
            if(t==0){
                return 0;
            }
            for(int i=n;i>1;i--){
                if(num[t]>0){
                    num[t]--;
                    cout<<t<<' '<<i<<endl;
                }
                else if(t>1){
                    t--;
                    num[t]--;
                    cout<<t<<' '<<i<<endl;
                }
            }
        }
    }
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
  • 原文地址:https://www.cnblogs.com/maybe96/p/9417453.html
Copyright © 2011-2022 走看看