SICNU 2018 Summer Training #6
阿新 • • 發佈:2018-08-04
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