link
A - Is It Easy ?
easy
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int N=1e5+5;
ll n,k;
int main(){
cin>>n>>k;
cout<<n*k;
return 0;
}
B - Road to Arabella
当只能选择1的时候是能确定胜负局面的时候。假如
k
=
=
n
k==n
k==n或
k
=
=
n
−
1
k==n-1
k==n−1,则一开始就确定了胜负,n偶Kilani负,n奇Kilani胜。假如k<n-1,Kilani先手,可以选择一个数使m为偶数,且之后的回合都只能选1,必胜。
#include<bits/stdc++.h>
using namespace std;
int T;
int main(){
scanf("%d",&T);
while (T--)
{
int n,m;
bool flag;
scanf("%d%d",&n,&m);
if(m>=n-1){
if(n%2==0) flag=false;
else flag=true;
}
else flag=true;
if(flag)
cout << "Kilani" << endl;
else
cout << "Ayoub"<<endl;
}
}
C - Check The Text
用队列表示输入字符串,然后匹配即可。
#include<bits/stdc++.h>
using namespace std;
queue<string> qq;
deque<char> st;
int n,m;
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
string temp;
cin>>temp;
qq.push(temp);
}
scanf("%d",&m);
bool cc=false;
for(int i=0;i<m;i++){
string temp;
cin>>temp;
if(temp.length()>1){
if(temp[0]=='B'){
if (!st.empty())
st.pop_back();
}
else if(temp[0]=='C'){
cc=!cc;
}
else{
st.push_back(' ');
}
}else{
char c=temp[0];
if(cc) c=c-32;
st.push_back(c);
}
}
string com="";
string org="";
while(!qq.empty()){
org+=qq.front();
qq.pop();
if(!qq.empty())
org+=' ';
}
while (!st.empty())
{
com+=st.front();
st.pop_front();
}
bool res=true;
if(org.size()!=com.size()) res=false;
else{
for(int k=0;k<org.size();k++){
if(org[k]!=com[k]){
res=false;
break;
}
}
}
if (res)
cout << "Correct" << endl;
else
cout << "Incorrect" << endl;
return 0;
}
D - Meeting Bahosain
假如这个数列最终能相等,那么他们之间可以任意转化。假如能把a[0]变成a[1]……a[n-2]变成a[n-1],这个数列最终就能相等。假如能相等,每个元素都能表示成
a
[
x
]
=
a
[
x
−
1
]
+
k
1
∗
b
[
0
]
+
k
2
∗
b
[
1
]
+
…
…
k
n
−
1
∗
b
[
n
−
1
]
a[x]=a[x-1]+k1*b[0]+k2*b[1]+……kn-1*b[n-1]
a[x]=a[x−1]+k1∗b[0]+k2∗b[1]+……kn−1∗b[n−1],
a
[
x
]
−
a
[
x
−
1
]
=
k
∗
g
c
d
(
b
)
a[x]-a[x-1]=k*gcd(b)
a[x]−a[x−1]=k∗gcd(b)。则若a中所有元素的最大公约数若能被所有b中所有元素的最大公约数整除就可以转化。
#include <bits/stdc++.h>
using namespace std;
int n, m;
int main()
{
scanf("%d%d", &n, &m);
int g1, g2;
for (int i = 0; i < n; i++)
{
int temp;
scanf("%d", &temp);
if (!i)
g1 = temp;
else
g1 = __gcd(g1, temp);
}
for (int i = 0; i < m; i++)
{
int temp;
scanf("%d", &temp);
if (!i)
g2 = temp;
else
g2 = __gcd(g2, temp);
}
if (g1 % g2 == 0||n==1)
printf("Yes\n");
else
printf("No\n");
return 0;
}
G - Card Game
对于选择的i,只有对手选择1~i-1时才能得分,所以期望是对于所有i,i*(i-1)/n的和。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
scanf("%d",&n);
double ans=0;
for(int i=1;i<=n;i++){
ans=ans+i*1.0*(i-1)/n;
}
printf("%.6lf",ans);
return 0;
}
H - Steaks
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll n,m;
cin>>n>>m;
if(n<=2*m) printf("10\n");
else{
ll ans=(2*n)/(2*m);
if ((2 * n) % (2 * m)) ans++;
ans*=5;
cout<<ans<<endl;
}
return 0;
}
I - Bashar and Hamada
排好序后。选两个时,一定选头尾两个,选第三个的时候选谁都一样,选第四个的时候的增量就相当于选第三个的时候的增量+第四个与第三个之差,所以三、四也要从头尾选。以此类推,每次都从头尾选。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int arr[300000];
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
int temp;
scanf("%d",&temp);
arr[i]=temp;
}
sort(arr,arr+n);
ll ans=arr[n-1]-arr[0];
ll b1=ans;
ll b2=2*ans;
cout<<b1<<" ";
if(n>2)
cout<<b2<<" ";
for(int i=4;i<=n;i++){
ll rec = b2;
if(i%2!=0){
b2 = -b1 + 2*b2;
}
else{
b2=-b1+2*b2+arr[n-i/2]-arr[i/2-1];
}
b1 = rec;
cout<<b2<<" ";
}
cout<<endl;
return 0;
}
J - Thanos Power
考虑每位数如何构成
- 直接加 步骤n
- 借位 前一位不是借位得到的 步骤10-n+1
- 借位 前一位是借位得到的 步骤10-n-1 (减掉上一位多减的步骤)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
string s;
cin>>s;
ll a=s[0]-'0';
ll b=10-s[0]+'0'+1;
for(int i=1;i<s.length();i++){
ll ta=a,tb=b;
a=min(ta,tb)+s[i]-'0';
b=min(10-s[i]+'0'+1+ta,10-s[i]+'0'-1+tb);
}
cout<<min(a,b)<<endl;
return 0;
}
M - Two Operations
#include<bits/stdc++.h>
using namespace std;
string s;
int arr[26];
int main(){
ios::sync_with_stdio;
cin>>s;
memset(arr,26,0);
for(int i=0;i<s.length();i++){
arr[s[i]-'a']++;
}
for (int i = 0; i < 25; i++)
{
if(arr[i]==0) continue;
arr[i + 1] +=arr[i]/2;
if (arr[i] % 2 != 0) arr[i] = 1;
else arr[i]=0;
}
for(int i=0;i<arr[25];i++){
cout<<'z';
}
for(int i=24;i>=0;i--){
if(arr[i]==0) continue;
else cout<<char(i+'a');
}
cout<<endl;
return 0;
}