CodeForce刷题表
Day10
题意:
给三个数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; }
|
总结:
整体看
题意:
把01串的1全都放在最后面,可以进行的操作是:
输出需要进行几次操作,每次操作选取几个数,这几个数分别是什么
思路:
看一看有几个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; }
|
总结:
看整体