T1
光哥为了不让某初二奆佬恶心到我们而留下的火种
(貌似没这题平均分就100-了)
思路:就一横一竖让后就gztopa嘛
1 #include <bits/stdc++.h> 2 using namespace std; 3 int bigg,n; 4 int l,r; 5 int a[100010]; 6 int puke[20]; 7 int main(){ 8 scanf("%d",&n); 9 for(register int i=2;i<=11;i++) puke[i]=4; 10 puke[10]+=12; 11 for(register int i=1;i<=n;i++){ 12 scanf("%d",&a[i]); 13 bigg+=a[i]; 14 puke[a[i]]--; 15 } 16 //for(register int i=1;i<=11;i++) printf("%d ",puke[i]); 17 int X=21-bigg; 18 //printf("%d ",X); 19 for(register int i=2;i<=11;i++){if(i<=X) l+=puke[i];else if(i>X) r+=puke[i];} 20 if(r>=l) printf("DOSTA"); 21 else if(l>r) printf("VUCI"); 22 return 0; 23 }
T2
有点考验思维的一道题,虽然题目叫LCA,但是跟LCA没有
半毛钱关系;
思路:先建图,我们不难发现我们把一条路左右的点数统计一下
取min,min值*2就是这条路径最多能被遍历的次数所以我们就得到了
此题的解法,正确性十分显然...
1 #include <bits/stdc++.h> 2 using namespace std; 3 struct node{ 4 int to,nxt,w; 5 }edge[1000010]; 6 int cnt,dd,n,x,y,z; 7 int head[1000010]; 8 bool vis[1000010]; 9 bool chudu[1000010]; 10 int l[1000010]; 11 int aa[1000010]; 12 void addedge(int from,int to,int w){ 13 cnt++; 14 edge[cnt].to=to; 15 edge[cnt].w=w; 16 edge[cnt].nxt=head[from]; 17 head[from]=cnt; 18 } 19 long long ans; 20 void eat(int p){ 21 if(!chudu[p]){return;} 22 for(register int i=head[p];i;i=edge[i].nxt){ 23 eat(edge[i].to); 24 l[p]+=l[edge[i].to]; 25 } 26 } 27 void dfs(int m,int deep){ 28 for(register int i=head[m];i;i=edge[i].nxt){ 29 dfs(edge[i].to,deep+1); 30 l[dd]=max(deep,l[dd]); 31 } 32 } 33 int main(){ 34 scanf("%d",&n); 35 for(register int i=1;i<n;i++){ 36 scanf("%d%d%d",&x,&y,&z); 37 addedge(x,y,z); 38 aa[y]=z; 39 vis[y]=1; 40 chudu[x]=1; 41 } 42 for(register int i=1;i<=n;i++){if(!vis[i]) dd=i;l[i]=1;} 43 eat(dd); 44 l[dd]=0; 45 dfs(dd,1); 46 for(register int i=2;i<=n;i++){ 47 int xx=min(l[i],n-l[i]); 48 ans+=aa[i]*2*xx; 49 } 50 printf("%lld",ans); 51 return 0; 52 }
T3
显然这是一道字符串问题,难度中等偏高
思路:先跑一遍manachar,求出所有最长回文串,
其次跑一遍贪心即可
T3-
萨鲁曼的半兽人
1 #include <bits/stdc++.h> 2 using namespace std; 3 char a[100010]; 4 bool f[5010][5010]; 5 bool vis[100010]; 6 int len,n,now; 7 bool check(int l,int r){ 8 if(f[l][r]) return true; 9 else if(a[l]==a[r]) return check(l+1,r-1); 10 return false; 11 } 12 void inti(){ 13 for(register int i=1;i<=len;i++){ 14 f[i][i]=1; 15 if(a[i]==a[i+1]) f[i][i+1]=1; 16 } 17 return; 18 } 19 int main(){ 20 while(cin>>a+1){ 21 now=0; 22 memset(f,0,sizeof(f)); 23 memset(vis,0,sizeof(vis)); 24 len=strlen(a+1); 25 inti(); 26 //for(register int j=1;j<=len;j++) printf("%d ",f[i][j]);printf(" ");} 27 //printf(" "); 28 for(register int i=len;i>=1;i--){ 29 for(register int j=1;j<=len-i+1;j++){ 30 if(vis[j]) continue; 31 if(check(j,j+i-1)){ 32 //cout<<j<<" "<<j+i-1<<endl; 33 now++; 34 for(register int k=j;k<=j+i-1;k++) vis[k]=1; 35 }//eabcbcbabaedcde 36 } 37 } 38 printf("%d ",now-1); 39 } 40 return 0; 41 }
end;