A.AOE还是单体伤害

题目链接:http://oi.nks.edu.cn/zh/Problem/Details/6886
很简单,贪心就完事了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n,x,a[N];
long long ans;
bool cmp(int x,int y)
{
return x < y;
}
int main()
{
scanf("%d %d",&n,&x);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a + 1,a + 1 + n,cmp);
if(x > n)
{
for(int i=1;i<=n;i++)
{
ans += a[i];
}
printf("%lld",ans);
return 0;
}
for(int i=n-x+1;i<=n;i++)
{
ans += (a[i] - a[n - x + 1]);
}
printf("%lld",ans + x * a[n - x + 1]);
}

B.k-size字符串

题目链接:http://oi.nks.edu.cn/zh/Problem/Details/6887
先对字符串分段,再求逆元,因为$mod=10^{9} + 7$,所以写费马小吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5 + 5;
const ll mod = 1e9 + 7;
int n,m,k;
ll f[N],ans;
ll ksm(ll a,ll n)
{
ll ans = 1;
while(n > 0)
{
if(n & 1)ans = (ans * a) % mod;
a = (a * a) % mod;
n >>= 1;
}
return ans;
}
int main()
{
scanf("%d %d %d",&n,&m,&k);
f[0] = 1;
for(int i=1;i<=100000;i++)
f[i] = (f[i - 1] * i) % mod;
if(k & 1) {
if(n >= (k + 1) / 2 && m >= k / 2)
ans += (((f[n - 1] * ksm(f[k / 2], mod - 2)) % mod * ksm(f[n - k / 2 - 1], mod - 2)) % mod) * (((f[m - 1] * ksm(f[k / 2 - 1], mod - 2)) % mod * ksm(f[m - k / 2], mod - 2)) % mod) % mod;
if(n >= k / 2 && m >= (k + 1) / 2)
ans += (((f[m - 1] * ksm(f[k / 2], mod - 2)) % mod * ksm(f[m - k / 2 - 1], mod - 2)) % mod) * (((f[n - 1] * ksm(f[k / 2 - 1], mod - 2)) % mod * ksm(f[n - k / 2], mod - 2)) % mod) % mod;
}
else
{
if(n >= k / 2 && m >= k / 2)
ans += 2 * (((f[n - 1] * ksm(f[k / 2 - 1], mod - 2)) % mod * ksm(f[n - k / 2], mod - 2)) % mod) * (((f[m - 1] * ksm(f[k / 2 - 1], mod - 2)) % mod * ksm(f[m - k / 2], mod - 2)) % mod) % mod;
}
printf("%lld",ans);
return 0;
}

C.白魔法师

不会。
题目链接: http://oi.nks.edu.cn/zh/Problem/Details/6888

D.点击消除

题目链接: http://oi.nks.edu.cn/zh/Problem/Details/6889
模拟+暴力,循环判断就行了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<bits/stdc++.h>
using namespace std;
const int N = 3e5 + 5;
string s;
bool dis[N];
int check()
{
bool mark = true;
for(int i=0;i<=s.length();i++)
{
if(s[i] == s[i + 1] && !dis[i] && !dis[i + 1])
{
dis[i] = 1,dis[i + 1] = 1;
mark = false;
}
}
if(mark)return 1;
return 0;
}
int main()
{
cin >> s;
while(check() == 0)
{
string ss = "";
for(int i=0;i<s.length();i++)
{
if(dis[i] == 0)ss += s[i];
}
for(int i=0;i<s.length();i++)dis[i] = 0;
s = ss;
}
if(s == "")printf("0");
else cout << s;
return 0;
}

E.自我检索

题目链接: http://oi.nks.edu.cn/zh/Problem/Details/6890
模拟,easy:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n,m,a[N];
double q()
{
double sum = 0;
for(int i=1;i<=n;i++)sum += a[i];
return sum / n;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n - m;i++)
{
scanf("%d",&a[i]);
}
for(int i=n-m+1;i<=n;i++)a[i] = 1;
printf("%.5lf ",q());
for(int i=n-m+1;i<=n;i++)a[i] = 5;
printf("%.5lf",q());
return 0;
}

F.解方程

题目链接: http://oi.nks.edu.cn/zh/Problem/Details/6891
$∵a,b,c > 0$,所以是一个单调函数,二分答案就行了,注意为控制精度,多二分几次:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<bits/stdc++.h>
using namespace std;
int a,b,c;
int main()
{
scanf("%d %d %d",&a,&b,&c);
double l = 1,r = 1e9;
for(int i=1;i<=100;i++)
{
double mid = (l + r) / 2;
if(pow(mid,a) + b * log(mid) >= c)r = mid;
else l = mid;
}
printf("%.7lf",l);
return 0;
}

G.神奇的字母

依然模拟。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<bits/stdc++.h>
using namespace std;
char c;
int ans[123],maxn;
int main()
{
while(~scanf("%c",&c))
{
if(c >= 'a' && c <= 'z')
{
ans[(int)(c - 'a')]++;
}
}
char res;
for(int i=0;i<=25;i++)
{
if(ans[i] > maxn)
{
maxn = ans[i],res = (char)('a' + i);
}
}
printf("%c",res);
return 0;
}

H.异或和之和

题目链接: http://oi.nks.edu.cn/zh/Problem/Details/6893
将每个二进制位分开处理,最后汇总一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2e5 + 5;
const ll mod = 1e9 + 7;
int n,sum[64];
ll f[N],ans[64],answ;
ll ksm(ll a,ll n)
{
ll ans = 1;
while(n > 0)
{
if(n & 1)ans = (ans * a) % mod;
a = (a * a) % mod;
n >>= 1;
}
return ans;
}
int main()
{
scanf("%d",&n);
f[0] = 1;
for(int i=1;i<=200000;i++)
f[i] = (f[i - 1] * i) % mod;
ll a;
int p;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a);
p = 0;
while(a)
{
sum[p] += a & 1;
p++;
a >>= 1;
}
}
for(int i=0;i<64;i++)
ans[i] = (sum[i] * (((f[n - sum[i]] * ksm(f[2], mod - 2)) % mod * ksm(f[n - sum[i] - 2], mod - 2)) % mod) + (((f[sum[i]] * ksm(f[3], mod - 2)) % mod * ksm(f[sum[i] - 3], mod - 2)) % mod)) % mod;
for(int i=63;i>=0;i--)
answ = ((answ << 1) + ans[i]) % mod;
printf("%lld",answ);
return 0;
}