CodeForce刷题表

Day10

1605A - A.M. Deviation

题意:

给三个数a,b,c,可以让一个数+1任意其它数-1,求a+c-2*b的最小绝对值。

思路:

直接把a和c加起来看成一个整体,然后发现对于a+c-2b这个式子,每次操作可以让整体+3或者-3,所以只要对a+c-2b取余3即可。

如果余数是2,那么可以再+3(或-3)让他的绝对值变成1,所以余数是1和2的时候输出1,否则输出0

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+5;
const ll mod = 1e9+7;
int main(){
int _;cin>>_;
while(_--) {
int a,b,c;
cin>>a>>b>>c;
a += c;
int t = abs(a-2*b)%3;
if(t==2 || t==1)
cout<<1<<endl;
else
cout<<0<<endl;
}
return 0;
}

总结:

整体看

1605B - Reverse Sort

题意:

把01串的1全都放在最后面,可以进行的操作是:

  • 任选n个数对称交换位置

输出需要进行几次操作,每次操作选取几个数,这几个数分别是什么

思路:

看一看有几个1,后面的位置全是1,那么前面的位置全是0,记录一下0的位置上有几个1,输出2*1的个数就是选取的个数。

只需要把(0位置上的1)和(1位置上的0)的位置输出了即可。

如果给定的就是已经排好了的,进行0此操作,否则进行一次即可。

代码:

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>
using namespace std;
typedef long long ll;
const int N = 1e6+5;
const ll mod = 1e9+7;
int main(){
int _;cin>>_;
while(_--) {
int n;
string s;
cin>>n>>s;
int len = s.size();
int t = 0;
int num = 0;
for(int i=0;i<len;i++)
if(s[i]=='1')
t++;
t = len - t;
for(int i=0;i<t;i++)
if(s[i]=='1')
num++;
if(num==0) {
cout<<0<<endl;
continue;
}
cout<<1<<endl;
cout<<num*2;
for(int i=0;i<len;i++)
if(i < t && s[i]=='1')
cout<<" "<<i+1;
else if(i >= t &&s[i] == '0')
cout<<" "<<i+1;
cout<<endl;


}
return 0;
}

总结:

看整体