A. K-divisible Sum
题意:给你一个长度为n的数组 问使得数组的和被k整除时
问a中最大元素最小是多少
思路:
当n<=k时 取(n+k-1)/k 向上取整
当n>k时必然可以取2(必然可以使得n的和是k的倍数)
但是当n时k的倍数时取1即可(当时我sb了)
#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
main(){
int T;
cin>>T;
while(T--){
int n,k;
scanf("%d%d",&n,&k);
if(n<=k)
cout<<(k+n-1)/n<<endl;
else if(n%k)cout<<2<<endl;
else cout<<1<<endl;
}
return 0;
}
B. Inflation
题意:使得每月涨幅不超过 k% 最低增加多少
思路:
- :x/sum<=k/100
- x100<=sumk
- 所以当不满足时 sum+d
- dk=x100-sum*k
- 累加d*k最后求结果时向上取整即可
#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
const int N=2e5+10;
long long a[N];
main(){
int T;
cin>>T;
while(T--){
long long n,k;
cin>>n>>k;
long long sum=0;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
sum+=a[i];
}
sum*=k;
long long res=0;
for(int i=n;i>=2;i--){
sum-=a[i]*k;
if(sum<a[i]*100){
long long d=a[i]*100-sum;
sum+=d;
res+=d;
}
}
cout<<(res+k-1)/k<<endl;
}
return 0;
}
C.Longest Simple Cycle
题意 :问形成简单环的最长节点数是多少
思路:贪心递推即可
#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
const int N=2e5+10;
long long a[N],b[N],c[N];
int main(){
int T;
cin>>T;
while(T--){
long long n,k,d;
cin>>n;
for(int i=1;i<=n;i++){
scanf("%lld",&c[i]);
}
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
for(int i=1;i<=n;i++){
scanf("%lld",&b[i]);
}
long long maxv=0;
long long pre=c[n];
for(int i=n;i>=2;i--){
if(b[i]!=a[i]){
maxv=max(maxv,max(a[i]-b[i]+1,b[i]-a[i]+1)+pre);
pre+=min(c[i-1]-a[i]+b[i]+1,c[i-1]-b[i]+a[i]+1);
}
else{
pre+=1;
maxv=max(maxv,pre);
pre=c[i-1];
}
pre=max(c[i-1],pre);
}
cout<<maxv<<endl;
}
return 0;
}
D. Journey
题意:每走一步LR将会反转 问一个点最多去多少点
思路:从左边看我们能知道RLRLRLRL我们能一直走 从右边看RLRLRLRL我没能一直走 所以我们从左网友 从右往左分别统计这样的个数 最后输出即可
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
typedef long long LL;
const int N = 3e5 + 10;
int f[N][2];
char str[N];
int pre[N][2],suf[N][2];
int main()
{
int T;
cin>>T;
while(T--){
memset(pre,0,sizeof pre);
memset(suf,0,sizeof suf);
int n;
cin>>n;
scanf("%s",str+1);
for(int i=1;i<=n;i++){
if(str[i]=='L')
pre[i][1]+=pre[i-1][0]+1;
else pre[i][0]+=pre[i-1][1]+1;
}
for(int i=n;i>=1;i--){
if(str[i]=='R')
suf[i][1]+=suf[i+1][0]+1;
else suf[i][0]+=suf[i+1][1]+1;
}
for(int i=0;i<=n;i++){
printf("%d ",suf[i+1][1]+pre[i][1]+1);
}
}
}