这个视频讲解一定不能倍速看
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;
}
P2957 [USACO09OCT]Barn Echoes G – 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#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!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/131427.html