这个视频讲解一定不能倍速看
AcWing 4366. 上课睡觉(寒假每日一题2023) - AcWing
#include <iostream> using namespace std; const int N = 100010; int n; int w[N]; bool check(int cnt)//cnt=sum/i表示每堆的石子数 { for (int i = 0, s = 0; i < n; i ++ ) { s += w[i]; if (s > cnt) return false; if (s == cnt) s = 0;//刚好满足一堆,那么清零,准备下一堆 } //如果s<cnt,它还可以继续增加石子数 return true; } int main() { int T; scanf("%d", &T); while (T -- ) { scanf("%d", &n); int sum = 0; for (int i = 0; i < n; i ++ ) { scanf("%d", &w[i]); sum += w[i]; } for (int i = n; i; i -- )//从大到小枚举,方便找到最大的i { if (sum % i == 0 && check(sum / i))//由于最终每堆的石子数量相等,所以sum%i==0 { // sum/i是每堆的石子数 printf("%d\n", n - i); break; } } } return 0; }
P2010 [NOIP2016 普及组] 回文日期 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这个题虽然题目很长,但 暗藏玄只因
下面代码中的做法不是刻意求出回文串
而是自己先写出一半,再复刻出另一半(相当于自己写出了一个回文串)
然后判断这个自己写出的数是否在题目给出的范围内
Oh xie!
#include <bits/stdc++.h> using namespace std; int main() { int a[13]={0,31,29,31,30,31,30,31,31,30,31,30,31}; int k[367],n=0,t,p,q,ans=0; cin>>p>>q; for(int i=1;i<=12;i++) { for(int j=1;j<=a[i];j++) { t=i*100+j;//先算出一半 k[++n]=(t%10*1000+t/10%10*100+t/100%10*10+t/1000%10)*10000+t;//再复刻出另一半 if(k[n]>=p&&k[n]<=q)//在题目中给出的两个日期中间 ans++; } } cout<<ans; return 0; }
#include <bits/stdc++.h> using namespace std; string s1,s2; int len1=1,len2=1; int main() { cin>>s1>>s2; for(int i=1;i<=min(s1.size(),s2.size());i++)//比较s1与s2长度,并取最小 { if(s1.substr(0,i)==s2.substr(s2.size()-i,i))//提取子串 { len1=i; } if(s2.substr(0,i)==s1.substr(s1.size()-i,i)) { len2=i; } } if(len1>len2)//比较大小,输出 { cout<<len1; } else { cout<<len2; } }
Code over!