Codeforces Round #624 (Div. 3)
作者:互联网
A
选正奇数 增加,正奇数减少,首先判断两个数的大小关系。看是该增加还是减少,然后答案显然只有0,1,2。
int main(){
int t = read();
while(t--){
ll a,b;
a = read();b = read();
if(a == b) puts("0");
else if(a < b){
if((b - a) % 2 != 0) puts("1");
else {
puts("2");
}
}
else{
if((a - b) % 2 == 0) puts("1");
else puts("2");
}
}
}
B
给你n个数字,然后再给你m个数,p1,p2...pm,你可使任意次交换pi,pi+1处的 位置。问你是否可以排成非递减序列。
思路:
冒泡即可。只不过只能交换pi,pi+1位置的数。
O(n⋅m)
int a[200];
int b[200];
int main(){
int t = read();
while(t--){
int n = read(),m = read();
for(int i = 1;i <= n;++i) a[i] = read();
for(int i = 1;i <= m;++i){
b[i] = read();
}
for(int i = 1;i <= n;++i){
for(int j = 1;j <= m;++j){
if(a[b[j]] > a[b[j]+1]) swap(a[b[j]],a[b[j]+1]);
}
}
if(is_sorted(a+1,a+n+1)) puts("YES");
else puts("NO");
}
}
C
给你一个一个字符串,里面的字母代表开关,你从头开始按,按到某一处出错后,下一次要从头开始按。给你 m个数,代表着按错的开关的位置。让你输出26个字母。表示开关被按下的次数。
思路:
开关在第i个位置处出错,说明第i个位置按下后,下一次要从1开始按,也就是[1,i]位置的开关都多按了一次。我们不妨设有一个数组d,d[i]意思是i之前的位置多按了几次。然后遍历m个错误个位置累加贡献,最后倒着累加,最后统计即可。
ll f[N];
char s[N];
ll b[28];
int main(){
int t = read();
while(t--){
memset(f,0,sizeof f);
memset(b,0,sizeof b);
int n = read(),m = read();
scanf("%s",s+1);
for(int i = 1;i <= m;++i){
ll a= read();
f[a] ++;
}
for(int i = n-1;i >= 1;i--) f[i] += f[i+1];
for(int i = 1;i <= n;++i){
b[s[i]-'a'] += f[i] + 1;
}
for(int i = 0;i < 26;++i) printf("%lld ",b[i]);
puts("");
}
}
D
题意给你三个数A,B,C,然后每个数都可以+1 / -1。让你输出A | B && B | C 需要进行的最小操作数。
思路:
1、枚举倍数
复杂度为nlogn级別,并非n2级别。。。还要注意上线设大些
int res[3];
int main(){
int t = read();
while(t--){
ll a = read(),b = read(),c = read();
ll ans = INF;
for(int i = 1;i <= 2e4;++i){
for(int j = i;j <= 2e4;j += i){
for(int k = j;k <= 2e4;k += j){
int d = abs(i-a)+abs(j-b)+abs(k-c);
if(ans > d) {ans = d;res[0] = i;res[1] = j;res[2] = k;}
}
}
}
cout << ans<<endl;
cout << res[0] <<' '<<res[1] <<' '<<res[2]<<endl;
}
}
2、预处理2e4级别的因子,枚举b,然后O(1)得到c,然后a必为b的因子,枚举一下a。取最小。
int res[3];
vector<int> Q[N];
void init(){
for(int i = 1;i <= 2e4;++i){
for(int j = 1;j <= sqrt(i);++j){
if(i % j == 0) {Q[i].push_back(j);if(i/j != j) Q[i].push_back(i/j);}
}
}
}
int main(){
init();
int t = read();
while(t--){
ll a = read(),b = read(),c = read();
ll ans = INF;
for(int i = 1;i <= 2e4;++i){
int d = c / i;
int c1 = d * i,c2 = (d+1)*i;
if(abs(c1-c) > abs(c2-c)) swap(c1,c2);//c1为c
ll sum = abs(c1 - c) + abs(i-b);
int S = Q[i].size();
for(int j = 0;j < S;++j){
ll a1 = Q[i][j];//枚举a值
if(ans > sum + abs(a-a1)) ans = sum + abs(a-a1),res[0] = a1,res[1] = i,res[2] = c1;
}
}
cout << ans<<endl;
cout << res[0] <<' '<<res[1] <<' '<<res[2]<<endl;
}
}
E
F
标签:puts,624,int,res,ll,Codeforces,read,Div,pi 来源: https://blog.csdn.net/qq_43408238/article/details/104500116