http://codeforces.com/contest/1076
A. Minimizing the String
从前往后遍历,如果当前字母比后一位字母大,则删除这个一个(停止遍历),如果遍历完,则删除最后一个。
#include<bits/stdc++.h>
using namespace std;
string s;
int main(){
int n;
whib(cin>>n>>s){
int pre=s.size();
for(int i=0;i<s.size()-1;++i){
if(s[i]>s[i+1]){
s.erase(s.begin()+i);
break;
}
}
if(s.size()==pre){
s.erase(s.end()-1);
}
cout<<s<<endl;
}
return 0;
}
B. Divisor Subtraction
如果该数是素数那就是1,如果是偶数那/2就行了,如果是奇数,我们应该知道素数除了2以为都是奇数,所以他的最小素数因子肯定是个奇数(是2那就是偶数了,一个奇数减去奇数,那就是是个偶数,/2就行,如果直接用朴素的方法判断素数还是会T,可以用一个素数栅。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX=5000000+5;
ll n;
bool is_prime[MAX+1];//判断是不是素数
void solve(ll n) {
fill(is_prime,is_prime+MAX+1,true);
is_prime[0]=false;
is_prime[1]=false;
for(int i=2; i<=n; ++i) {
if(is_prime[i]) {
for(int j=i*2; j<=n; j+=i)
is_prime[j]=false;
}
}
}
int main() {
whib(cin>>n) {
bool flag=1;
for(ll i=2;i*i<=n;++i){
if(n%i==0){
flag=0;
break;
}
}
if(flag) {
cout<<1<<endl;
} else {
solve(sqrt(n)+1);
ll res=0;
if(n%2==0) { //n为偶数
cout<<n/2<<endl;
} else { //n为奇数
for(ll i=2; i*i<=n; ++i) {
if(is_prime[i] && n%i==0) {
n-=i;
res++;
break;
}
}
res+=n/2;
cout<<res<<endl;
}
}
}
return 0;
}
C. Meme Problem
第一眼看上去是个二分(二分了很久没二分出来。。。。最后发现是个一元二次方程
#include<bits/stdc++.h>
using namespace std;
const double cnt=1e-6;
int T;
double d;
int main() {
scanf("%d",&T);
while(T--) {
cin>>d;
double tt=d*d-4*d;
if(tt<0) {
cout<<"N"<<endl;
} else {
double ans1=(d+sqrt(tt))/2;
double ans2=(d-sqrt(tt))/2;
printf("Y %.9lf %.9lf\n",ans1,ans2);
}
}
return 0;
}
补题flag
D. Edge Deletion