SICNU 2018 Summer Training #6
Posted maybe96
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; } } } }
以上是关于SICNU 2018 Summer Training #6的主要内容,如果未能解决你的问题,请参考以下文章
MYGE 2018 SPRING/SUMMER COLLECTION
集训实录2018_XDU_ACM_SUMMER_TRAINING
Deep Learning and Reinforcement Learning Summer School 2018
2018-2019 Summer Petrozavodsk Camp, Oleksandr Kulkov Contest 2解题报告