先更个这两天练手速的一场吧。
A. Remainder
题意
给出一个长度为n的二进制串,若要令该串对1<<x求模后为1<<y,最少需要改动多少位
题解
水题, 0 ~ y-1位为0,y位为1,y+1 ~ x-1位为0,比较不同即可
Code
#include <bits/stdc++.h>
#define reg register
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
#define inf 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.0)
#define e exp(1.0)
#define ios ios::sync_with_stdio(false)
#define rep(i,l,r) for(int i=(l);i<(r);i++)
using namespace std;
const int maxn = 2e5 + 10;
const int mod = 1e9 + 7;
int main()
{
// int t;
// cin>>t;
// while(t--){
int n,x,y;
cin>>n>>x>>y;
string s;
cin>>s;
reverse(s.begin(),s.end());
int cnt = 0;
for(int i = 0;i < y;++i){
if(s[i] == '1') cnt++;
}
if(s[y] == '0') cnt++;
for(int i = y+1;i < x;++i){
if(s[i] == '1') cnt++;
}
printf("%d\n",cnt);
// }
return 0;
} B. Polycarp Training
题意
给出n场比赛列表,每场比赛包含若干问题,第i天要解决i道问题,但是打过的比赛就不能再打了,问这些场比赛能够用来训练多久
题解
直接升序排序,找到所有a[j] >= i 的场数即可。
code
#include <bits/stdc++.h>
#define reg register
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
#define inf 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.0)
#define e exp(1.0)
#define ios ios::sync_with_stdio(false)
#define rep(i,l,r) for(int i=(l);i<(r);i++)
using namespace std;
const int maxn = 2e5 + 10;
const int mod = 1e9 + 7;
int main()
{
ios;
int n;
cin>>n;
vector<int> a;
a.resize(n);
for(int i = 0;i < n;++i) cin>>a[i];
sort(a.begin(),a.end());
int cnt = 1;
for(int i = 0;i < n;++i){
if(a[i] < cnt) continue;
cnt++;
}
printf("%d\n",cnt-1);
return 0;
} C. Good String [贪心]
题意
定义goodstring 为对于所有奇数位置上的字符均不与其下一个字符相同,给出一个字符串,问最少删掉多少字符能使该串变为goodstring.
题解
贪心即可,当有n(n>1)个相同字符连在一起的时候,若第一个字符为奇数位,则这n个字符只能留下一个,相反,若为偶数位置,则n个字符可留下2个。
只需要在处理过程中计数,并对每段相同字符新建串即可,需要注意结果的长度不能为奇数,若为奇数直接删掉尾字符即可。
code
#include <bits/stdc++.h>
#define reg register
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
#define inf 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.0)
#define e exp(1.0)
#define ios ios::sync_with_stdio(false)
#define rep(i,l,r) for(int i=(l);i<(r);i++)
using namespace std;
const int maxn = 2e5 + 10;
const int mod = 1e9 + 7;
int main()
{
int n;
cin>>n;
string s;
cin>>s;
int cnt = 0;
int suc = 1;
string res;
for(int i = 1;i < n;++i){
if(s[i] == s[i-1]) suc++;
else{
if(suc == 1){
res += s[i-1];
continue;
}
if((i - cnt - suc) & 1) res+=s[i-1],res+=s[i-1],cnt += suc - 2;
else res += s[i-1],cnt += suc - 1;
suc = 1;
}
}
int i = n;
if(suc == 1){
res += s[i-1];
}
else{
if((i - cnt - suc) & 1) res+=s[i-1],res += s[i-1],cnt += suc - 2;
else res += s[i-1],cnt += suc - 1;
}
if((n - cnt)&1) res.pop_back(),cnt++;
printf("%d\n",cnt);
cout<<res<<endl;
return 0; D. Almost All Divisors
题意
给出n个数,为数x除1和x外的所有因子,问能否得到这个x,能输出x不能输出-1
题解
先把因子排序,若因子是全的,则x可以用最小的数与最大的数相乘得到。接下来只需要判断所有的因子是否均是x的因子,和因子个数是否缺少即可。
code
#include <bits/stdc++.h>
#define reg register
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
#define inf 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.0)
#define e exp(1.0)
#define ios ios::sync_with_stdio(false)
#define rep(i,l,r) for(int i=(l);i<(r);i++)
using namespace std;
const int maxn = 2e5 + 10;
const int mod = 1e9 + 7;
ll a[350];
int main()
{
int t;
cin>>t;
while(t--){
int n;
scanf("%d",&n);
for(int i = 0;i < n;++i){
scanf("%lld",&a[i]);
}
sort(a,a+n);
ll res = 0;
if(n & 1) res = a[n/2] * a[n/2];
else res = a[0] * a[n-1];
int ok = 1;
for(int i = 0;i < n/2;++i){
if(a[i] * a[n-1-i] != res){
ok = 0;
break;
}
}
if(ok){
int cnt = 0;
for(int i = 2;i <= sqrt(res);++i){
if(res % i == 0){
if(a[cnt++] != i){
ok = 0;
break;
}
}
}
}
if(ok) printf("%lld\n",res);
else printf("-1\n");
}
return 0;
} E. Two Arrays and Sum of Functions [数学]+[贪心]
题意
定义,
给出a,b序列,对b数组进行任意排序求解对于给出的l,r最小的
题解
我们设为
,根据
显而易见的是,对于每个,所求和的次数为
次。
所有原式可变为
考虑对于两个可重排的序列a,b,如何使最小?
显然将两个序列一个升序排列一个降序排列即可。
那么回到本题,我们完全可以将看为一个整体,这样
求解如何使
最小,这就回到了刚刚最简单的贪心问题。
code
#include <bits/stdc++.h>
#define reg register
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
#define inf 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.0)
#define e exp(1.0)
#define ios ios::sync_with_stdio(false)
#define rep(i,l,r) for(int i=(l);i<(r);i++)
using namespace std;
const int maxn = 2e5 + 10;
const ll mod = 998244353;
ll a[maxn],b[maxn];
ll cnt[maxn];
int main()
{
int n;
cin>>n;
for(int i = 0;i < n;++i) scanf("%lld",&a[i]);
for(int i = 0;i < n;++i) scanf("%lld",&b[i]);
for(int i = 1;i <= n;++i){
cnt[i-1] = 1ll * i * (n-i+1);
}
for(int i = 0;i < n;++i) a[i] = a[i] * cnt[i];
sort(a,a+n);
sort(b,b+n);
reverse(b,b+n);
ll res = 0;
for(int i = 0;i < n;++i){
res = (res + a[i] % mod * b[i] % mod) % mod;
}
printf("%lld\n",res);
return 0;
} 写完发现前几道题实在太水了写不写好像没啥意义...以后div3abc不写了好了...

京公网安备 11010502036488号