长为n的字符串s 至多删除1个使得字典序最小
https://codeforces.com/contest/1076/problem/A
ll n,m,T,minn=INF,maxx,cnt,sum,tmp,f=0,ans,f1;
string s;
int main(){
cin>>n>>s;
int ans=n-1; //全递增 删除最后1个
for(int i=0;i<n-1;i++){
if(s[i]>s[i+1]){
ans=i;
break;
}
}
for(int i=0;i<n;i++){ //acd(d)a
//acda
if(ans!=i)
cout<<s[i];
}
cout<<endl;
return 0;
}
B
给n<=1e10
每次删最小素因子 能删几次、
n为素数 最小素因子为本身 1次
n为奇数
1e5的素数筛就够了 找到最小素因子3删去 ans-=tmp
变为偶数 偶数的最小素因子为2
每次-2 ans/2+1
n为偶数 每次删最小素因子2
n/2次
const int maxn=4e5+5;
const int maxm=1e6+5;
const ll INF=0x3f3f3f3f;
const ll mod=1e9+7;
const double PI=acos(-1.0);
ll n,m,T,minn=INF,maxx,cnt,sum,tmp,f=0,ans,f1;
string s;
bool prime[maxn];
bool isprime(ll x){
for(ll i=2;i*i<=x;i++){
if(x%i==0)
return false;
}
return true;
}
void st(ll x){
for(int i=2;i<=1e5+10;i++){
if(!isprime(i))
continue;
prime[i]=true;
for(ll j=i+i;j<=1e5+10;j+=i){
prime[j]=false;
}
}
}
int main(){
cin>>n;
st(n);
ll ans=n;
if(isprime(n)){
return cout<<1<<endl,0;
}
if(ans&1){
for(int i=3;i<=1e5+10;i++){
if(ans%i==0 && prime[i])
{
tmp=i;
break;
}
}
ans-=tmp;
cout<<1+ans/2<<endl;
}
else
cout<<ans/2<<endl;
return 0;
}
C
一元二次方程
int d;
int main(){
cin>>T;
while(T--){
cin>>d;
if(d*d-4*d<0)
{
cout<<"N"<<endl;
continue;
}
double ans=max((d+sqrt(d*d-4.0*d))/2,(d-sqrt(d*d-4.0*d))/2);
if(ans<0)
cout<<"N"<<endl;
else
{
cout<<"Y ";
printf("%.9f %.9f\n",ans,d-ans);
}
}
return 0;
}