Word Processor
简单模拟
void solve(){
string s;
cin>>n>>m;ll cnt = 0;
rep(i,1,n){
cin>>s;
if(cnt+len(s)>m){
cout<<"\n"<<s<<" ";cnt=len(s);
}else{
cout<<s<<" ";cnt+=len(s);
}
}
return ;
}
Photoshoot
n<=1000,模拟操作即可,从小到大枚举ans[1],只要满足条件输出即可,因为i更小字典序一定更小
注意是排列,不能重复不缺失
ll n,m;
void solve(){
cin>>n;
vector<int> a(n+1),b(n+1);
rep(i,1,n-1)cin>>a[i];
rep(i,1,n){
vector<int> vis(n+1);
b[1]=i;
vis[i]=1;
bool f = 1;
rep(j,2,n){
b[j]=a[j-1]-b[j-1];
if(vis[b[j]]||b[j]<0||b[j]>n){f=0;break;}
vis[b[j]]=1;
}
if(f){
rep(i,1,n)cout<<b[i]<<" ";return ;
}
}
return;
}
Race
二分时间,也就是二分最大速度,画图讨论即可
分为一直加速,先加速后匀速后减速,先加速后减速
ll n,m,k;
ll calc(ll x,ll y){
if(x>y)swap(x,y);
return (y+x)*(y-x+1)/2;
}
ll work(ll up,ll x){
if(up<=x)return calc(1,up);
ll mid = (up+x)>>1;
if((up+x)%2==1)return calc(1,mid)+calc(x,mid);
else return calc(1,mid)+calc(mid-1,x);
}
void solve(){
cin>>k>>n;
rep(i,1,n){
int x;cin>>x;
ll l = 1,r = 100000;
while(l<=r){
ll mid = (l+r)>>1;
if(work(mid,x)>=k)r=mid-1;
else l=mid+1;
}
cout<<l<<'\n';
}
return;
}