Link。
T1
\(100\),没挂分。
依题计算即可。
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
//freopen("as01.in","r",stdin);
//freopen("as01.out","w",stdout);
ios::sync_with_stdio(0);
double a,b; cin>>a>>b;
cout<<setprecision(2)<<fixed<<a-(int)(a/b)*b;
return 0;
}
T2
\(100\),没挂分。
前缀和 + 断环成链。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e4+5;
int t,n,m;
int a[N],s[N];
signed main(){
//freopen("as02.in","r",stdin);
//freopen("as02.out","w",stdout);
ios::sync_with_stdio(0);
cin>>t;
while(t--){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=n+1;i<=2*n;i++) a[i]=a[i-n];
memset(s,0,sizeof(s));
for(int i=1;i<=2*n;i++) s[i]=s[i-1]+a[i];
int ans=-1e9,pos=0;
for(int i=1;i<=n;i++)
if(ans<s[i+m-1]-s[i-1])
ans=s[i+m-1]-s[i-1],pos=i;
cout<<ans<<' '<<pos<<'\n';
}
return 0;
}
T3
\(100 \to 27\),错因:思路错误。
考虑到指导总时间具有单调性,上二分答案。
check
时,对于当前答案 \(x\),计算每位老师能指导的人数之和是否 \(\ge m\)。
对于总时间 \(l\),我们计算出直到 \(l-2\) 时刻每位老师能指导的人数之和 \(last\)。
顺次枚举每位老师,若其在 \(l-1\) 时刻存在空闲,则将其安排给第 \(m\) 个人即可。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,m;
int a[N];
bool check(int x){
int cnt=0;
for(int i=1;i<=n;i++) cnt+=(x-1+a[i])/a[i];
return cnt>=m;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
int l=0,r=m*100000ll;
while(l<r){
int mid=(l+r)>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
int last=0,ans=0;
for(int i=1;i<=n;i++) last+=(l-2+a[i])/a[i];
for(int i=1;i<=n;i++){
if((l-1)%a[i]==0){
last++;
if(last==m){ ans=i; break; }
}
}
cout<<ans;
return 0;
}
总结:
-
\(300 \to 227,rk4\)。/fn
-
对于自己想出来的思路要求证。