1. 程式人生 > >SICNU 2018 Summer Training #6

SICNU 2018 Summer Training #6

max 情況 har 序列 sizeof spa 思路 cstring names

  這套題還是比較基礎的。

  首先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\n1 2\n"); else printf("YES\n1 3\n"); } else if(t1) { s[t1]=1; int t2=find(); if(!t2) printf("YES\n%d %d\n",t1,t1+1); else { s[t2]=1; int t3=find(); if(!t3) printf("YES\n%d %d\n",t1,t2+1); else printf("NO\n"); } } 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\n");
    else{
        printf("YES\n");
        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;
            }
        }
    }
}

SICNU 2018 Summer Training #6