反思:对于思维题的练习需要加强,这两周的重点也都在思维题,但是问题还是比较多的。感觉我的思维不是特别的灵活,需要多做题。此篇博客记录week11上面没有写出来的题目,还有就是本周的写的一些值得反思的题目。
一:week11题
死亡笔记这道题,大概的意思就是一共几天时间,每页笔记可以记录多少字,然后给出每天必须写多少字,问当天要翻几页笔记。
思维题,要好好想如何去记录当页剩余。和如何计数。
#include<bits/stdc++.h>
using namespace std;
int a[200005];
int b[200005];
int n,m;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
int s=m;
for(int i=1;i<=n;i++)
{
if(a[i]<s)
{
b[i]=0;
s=s-a[i]; //注意这里,到底是s-a[i],还是m-a[i],应该是s,因为很可能当前这一页用好多天
}
else
{
b[i]++;
int x=(a[i]-s)/m;//计算补齐上一页剩下的之后,还要写多少页
b[i]=b[i]+x;
s=m-(a[i]-s)%m; //因为一定是重新开始的一页,所以一定是m-m-(a[i]-s)%m
}
}
for(int i=1;i<=n;i++)
{
cout<<b[i]<<" ";
}
return 0;
}
这道题就是说,让把一个数组分成k份,但是每份相加都必须为奇数
数学里面:奇数+奇数=偶数
奇数+偶数=奇数 偶数+偶数=偶数
综合思考后,代码如下:
#include<bits/stdc++.h>
using namespace std;
int q,n,k;
int a[200005];
int main()
{
cin>>q;
while(q--)
{
int ans=0;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]%2!=0)
ans++; //看数组里面有多少奇数
}
if(k%2==ans%2&&ans>=k)//细节,必须和份数同是奇数或者同为偶数才行
{
cout<<"YES"<<'\n';
int cnt=0;
int s=0;
for(int i=1;i<=n;i++)
{
if(a[i]%2==1)
{
cnt++;
if(cnt==k)
{
cout<<n<<" ";
break;//不加不行,会wa
}
else
{
cout<<i<<" ";
}
}
}
cout<<'\n';
}
else cout<<"NO"<<'\n';
}
return 0;
}