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;
                }
            }
        }
    }
  • 相关阅读:
    c++智能指针-shared_ptr
    python全栈学习笔记(二)网络基础之子网划分
    python全栈学习笔记(一)网络基础之网络协议篇
    Fiddler抓包4-工具介绍(request和response)
    python接口自动化5-Json数据处理
    python接口自动化4-绕过验证码登录(cookie) (转载)
    Http status(二)
    python接口自动化1-发送get请求
    Fiddler抓包11-HTTPS证书Actions无法导出问题
    使用idea配置tomcat将web项目跑起来
  • 原文地址:https://www.cnblogs.com/maybe96/p/9417453.html
Copyright © 2011-2022 走看看