codeforces Educational Codeforces Round 54 (Rated for Div. 2) 題解
。。。。此次Div2就做了兩個題目,第一個題目wa了4次,22分鐘出的,第二道題目一遍過,18分鐘,然後看到c題感覺樣例好玄學,就搗鼓浮點數去了,沒想到是二元一次方程求解。。。還是太蠢了。
A:
You are given a string s consisting of n lowercase Latin letters.
You have to remove at most one (i.e. zero or one) character of this string in such a way that the string you obtain will be lexicographically smallest among all strings that can be obtained using this operation.
String s=s1s2…sn
is lexicographically smaller than string t=t1t2…tm if n<m and s1=t1,s2=t2,…,sn=tn or there exists a number p such that p≤min(n,m) and s1=t1,s2=t2,…,sp−1=tp−1 and sp<tp
.
For example, "aaa" is smaller than "aaaa", "abb" is smaller than "abc", "pqr" is smaller than "z".
Input
The first line of the input contains one integer n
(2≤n≤2⋅105) — the length of s
.
The second line of the input contains exactly n
lowercase Latin letters — the string s
.
Output
Print one string — the smallest possible lexicographically string that can be obtained by removing at most one character from the string s
.
Examples
Input
Copy
3 aaa
Output
Copy
aa
Input
Copy
5 abcda
Output
Copy
abca
Note
In the first example you can remove any character of s
to obtain the string "aa".
In the second example "abca" < "abcd" < "abcda" < "abda" < "acda" < "bcda".
找第i項比第i+1項大的。刪除的就是那個字元,如果沒有,則刪除最後一位。
程式碼如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=2*1e5+5;
int n;
char a[maxn];
int main()
{
scanf("%d",&n);
int loc;
char Max;
scanf("%s",a);
int flag=0;
for (int i=0;i<n-1;i++)
{
if(a[i]>a[i+1])
{
flag=1;
loc=i;
break;
}
}
if(!flag)
loc=n-1;
for (int i=0;i<n;i++)
if(i!=loc)
printf("%c",a[i]);
printf("\n");
return 0;
}
B. Divisor Subtraction
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
You are given an integer number n
. The following algorithm is applied to it:
- if n=0, then end algorithm;
- find the smallest prime divisor d of n;
- subtract d from n and go to step 1
-
Determine the number of subtrations the algorithm will make.
Input
The only line contains a single integer n
(2≤n≤1010).
Output
Print a single integer — the number of subtractions the algorithm will make.
Examples
InputCopy
5
OutputCopy
1
InputCopy
4
OutputCopy
2
Note
In the first example 5
is the smallest prime divisor, thus it gets subtracted right away to make a 0.
In the second example 2
is the smallest prime divisor at both steps.
當為偶數時,直接/2即可,當為奇數,求出列舉求出最小素因子,然後減去這個素因子,必定為偶數,然後轉化為偶數求解的方式。
程式碼如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <math.h>
using namespace std;
typedef long long ll;
ll n;
int is_su (ll x,ll& yin)
{
ll m=(ll)sqrt(x);
for (ll i=2;i<=m;i++)
{
if(x%i==0)
{
yin=i;
return 0;
}
}
return 1;
}
int main()
{
scanf("%lld",&n);
if(n%2==0)
{
printf("%lld\n",n/2);
}
else
{
ll t;
if(is_su(n,t))
{
printf("1\n");
}
else
{
printf("%lld\n",(n-t)/2+1);
}
}
return 0;
}
C. Meme Problem
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
Try guessing the statement from this picture:
You are given a non-negative integer d
. You have to find two non-negative real numbers a and b such that a+b=d and a⋅b=d
.
Input
The first line contains t
(1≤t≤103
) — the number of test cases.
Each test case contains one integer d
(0≤d≤103)
.
Output
For each test print one line.
If there is an answer for the i
-th test, print "Y", and then the numbers a and b
.
If there is no answer for the i
-th test, print "N".
Your answer will be considered correct if |(a+b)−a⋅b|≤10−6
and |(a+b)−d|≤10−6
.
Example
Input
Copy
7 69 0 1 4 5 999 1000
Output
Copy
Y 67.985071301 1.014928699 Y 0.000000000 0.000000000 N Y 2.000000000 2.000000000 Y 3.618033989 1.381966011 Y 997.998996990 1.001003010 Y 998.998997995 1.001002005
這題目想了50分鐘結果想歪了。。。
就是個解二元一次方程組的問題。
a+b=d; a*b=d;
則a*(d-a)=d;
則a*a-ad+d=0,
用求根公式求出一個解,然後d減去那個解就是b的答案。
程式碼如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <math.h>
using namespace std;
int t;
double d;
int main()
{
scanf("%d",&t);
while (t--)
{
scanf("%lf",&d);
double m;
m=d*d-4*d;
if(m<0)
{
printf("N\n");
}
else
{
double x1,x2;
m=sqrt(m);
x1=(d+m)/2;
x2=d-x1;
printf("Y %.9lf %.9lf\n",x1,x2);
}
}
return 0;
}