2021暑假每日一题 week4 完结
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021暑假每日一题 week4 完结相关的知识,希望对你有一定的参考价值。
目录
3781. 乘车问题【难度: 简单 / 知识点: 模拟】
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],n,m;
int main(void)
{
int t; cin>>t;
while(t--)
{
cin>>n>>m;
for(int i=0;i<n;i++) cin>>a[i];
int ans=0;
int t=0;
for(int i=0;i<n;i++)
{
if(t+a[i]>m) ans++,t=a[i];
else t+=a[i];
}
cout<<ans+1<<endl;
}
}
3782. 点【难度: 中 / 知识点: 数学 推式子】
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e5+10;
LL x[N],y[N],sumx,sumy;
int main(void)
{
int n;cin>>n;
for(int i=0;i<n;i++) cin>>x[i]>>y[i],sumx+=x[i],sumy+=y[i];
LL sum=0;
for(int i=0;i<n;i++)
{
sum+=n*(x[i]*x[i]+y[i]*y[i]);
}
sum-=sumx*sumx+sumy*sumy;
cout<<sum<<endl;
return 0;
}
3783. 第 k 个除数【难度: 一般 / 知识点: 数学 求因子】
能够整除n,指的是n%x==0 x 既可以整除n
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
vector<LL>ve;
int main(void)
{
LL n,k; cin>>n>>k;
for(LL i=1;i*i<=n;i++)
{
if(n%i==0)
{
ve.push_back(i);
if(n/i!=i) ve.push_back(n/i);
}
}
sort(ve.begin(),ve.end());
if(k<=ve.size()) cout<<ve[k-1];
else puts("-1");
return 0;
}
3784. 交换相邻元素【难度: 一般 / 知识点: 思维题】
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
int n;
string s;
int main(void)
{
cin>>n;
vector<int>ve(n+1,0);
for(int i=1;i<=n;i++) cin>>ve[i];
cin>>s;
s="0"+s;
for(int i=1;i<n;i++)
{
if(s[i]=='0'&&ve[i]!=i)//如果当前位置是0且不是对应的位置,则一定不行
{
puts("NO");
return 0;
}
if(s[i]=='1')
{
int minv=1e9;
int maxv=-1e9;
int j=i;
while(s[j]=='1')
{
minv=min(minv,ve[j]);
maxv=max(maxv,ve[j]);
j++;
}
minv=min(minv,ve[j]);
maxv=max(maxv,ve[j]);
if(maxv-minv!=j-i)//不是连续的
{
puts("NO");
return 0;
}
i=j;
}
}
puts("YES");
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
int n;
string s;
int main(void)
{
cin>>n;
vector<int>ve(n+1,0);
for(int i=1;i<=n;i++) cin>>ve[i];
cin>>s;
s="0"+s;
for(int i=1,t=0;i<n;i++)
{
t=max(t,ve[i]);
if(s[i]=='0'&&t!=i)//如果当前位置是0,且当前的最大值不是对应的位置,则一定不行
{
puts("NO");
return 0;
}
}
puts("YES");
return 0;
}
3785. 战舰 【难度: 一般 / 知识点: 枚举】
题目问的意思是,所有的合法方案中,哪个格子占了最多的次数。
直接枚举每一个格子,求每个格子占用的次数。
#include<bits/stdc++.h>
using namespace std;
char s[105][105];
int n,k,ans,x=1,y=1;
int main(void)
{
cin>>n>>k;
for(int i=1;i<=n;i++) scanf("%s",s[i]+1);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(s[i][j]=='#') continue;
int l=j,r=j;
while(l>=1&&s[i][l]=='.'&&j-l+1<=k) l--;
while(r<=n&&s[i][r]=='.'&&r-j+1<=k) r++;
int t=0;
if(r-l-k>0)t+=r-l-k;
l=i,r=i;
while(l>=1&&s[l][j]=='.'&&i-l+1<=k) l--;
while(r<=n&&s[r][j]=='.'&&r-i+1<=k) r++;
if(r-l-k>0) t+=r-l-k;//r-l-1 -k+1 加1是这个格子本身就占了一格
if(t>ans)
{
ans=t;
x=i,y=j;
}
}
}
cout<<x<<" "<<y;
return 0;
}
以上是关于2021暑假每日一题 week4 完结的主要内容,如果未能解决你的问题,请参考以下文章