2020.06.09 习题训练5
题目链接:https://vjudge.net/problem/CodeForces-1327A
思路:
问 n 能否分成 k 个不相同奇数的和,这里肯定要想到当 n 和 k 一奇一偶时,肯定不行,然后再考虑 k 过大时的情况,通过分析几个例子,得出 k*k > n时也是不成立的。(注意题目数据)
解题代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <string> #include <cstring> #include <map> using namespace std; const long long N = 1e10 + 7; const int maxn = 2e5 + 5; const long long INF = 8e18; typedef long long ll; #define for0(i,n) for(int i = 0;i < n;i++) #define for1(i,n) for(int i = 1;i <= n;i++) int main() { int t; cin >> t; while(t--){ ll n,m; cin >> n >> m; if(n%2 != m%2){ cout << "NO" << endl; } else if(m*m <= n) cout << "YES" << endl; else cout << "NO" << endl; } return 0; }
题目链接:https://vjudge.net/problem/CodeForces-1327B
思路:
对于每组数据,给出n代表 n 个国家,下面 n 行,每一行给出一个 k ,和 k个选择。主要是记录配对情况,对于每组一旦可配对,便用map标记记录,并跳出进行下一个国家的配对。中途若无可配对的国家,可以先记录一下。到后面再从map中寻找有无可配对的王子。最后根据情况输出。
解题代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <string> #include <cstring> #include <map> using namespace std; const long long N = 1e10 + 7; const int maxn = 2e5 + 5; const long long INF = 8e18; typedef long long ll; #define for0(i,n) for(int i = 0;i < n;i++) #define for1(i,n) for(int i = 1;i <= n;i++) map<int,int>ma; int a[maxn]; int main() { int t; cin >> t; while(t--){ int n,sign = 0,num = 0; cin >> n; for(int j = 1;j <= n;j++){ int m,findnum = 0; cin >> m; for1(i,m){ cin >> a[i]; } for1(i,m){ if(ma[a[i]] == 0 && findnum == 0){ ma[a[i]] = 1; findnum = 1; } if(findnum) break; } if(findnum == 0) sign = j; } for(int i = 1;i <= n;i++){ if(ma[i] == 0){ num = i; break; } } if(sign){ cout << "IMPROVE" << endl; cout << sign << " " << num << endl; } else cout << "OPTIMAL" << endl; ma.clear(); } return 0; }
题目链接:https://vjudge.net/problem/CodeForces-1325A
思路:
给出 x ,找出符合 GCD(a,b) + LCM(a,b) = x 的一组a,b 情况。其实只要想起利用 GCD(1,m) = 1, LCM(1,m) = m ,就可以得到答案为 1,x-1.
解题代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <string> #include <cstring> #include <map> using namespace std; const long long N = 1e10 + 7; const int maxn = 2e5 + 5; const long long INF = 8e18; typedef long long ll; #define for0(i,n) for(int i = 0;i < n;i++) #define for1(i,n) for(int i = 1;i <= n;i++) int main() { int t; cin >> t; while(t--){ ll x; cin >> x; cout << 1 << " " << x-1 << endl; } return 0; }
题目链接:https://vjudge.net/problem/CodeForces-1325B
思路:
这个题就是问这 n 个数有多少个不相同的数。
解题代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <string> #include <cstring> #include <map> #include <set> using namespace std; const long long N = 1e10 + 7; const int maxn = 2e5 + 5; const long long INF = 8e18; typedef long long ll; #define for0(i,n) for(int i = 0;i < n;i++) #define for1(i,n) for(int i = 1;i <= n;i++) set<int> s; int main() { int t; cin >> t; while(t--){ int n; cin >> n; for0(i,n){ int x; cin >> x; s.insert(x); } set<int> :: iterator it; cout << s.size() << endl; s.clear(); } return 0; }
题目链接:https://vjudge.net/problem/CodeForces-1324A
思路:
给出n个位置的高度,因为可以通过放高度为2的砖块消除,所以相邻差为奇数则可以,所以便是找是否有相邻奇偶性质不同则不符合条件。
解题代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <string> #include <cstring> #include <map> #include <set> using namespace std; const long long N = 1e10 + 7; const int maxn = 2e5 + 5; const long long INF = 8e18; typedef long long ll; #define for0(i,n) for(int i = 0;i < n;i++) #define for1(i,n) for(int i = 1;i <= n;i++) set<int> s; int main() { int t; cin >> t; while(t--){ int n,sign = 1,num; cin >> n; for(int i = 1;i <= n;i++){ int x; cin >> x; if(i == 1) num = x%2; else if(num == x%2) continue; else{ sign = 0; } } if(sign) cout << "YES" << endl; else cout << "NO" << endl; } return 0; }
题目链接:https://vjudge.net/problem/CodeForces-1324B
思路:
通过删减,问是否有一个长度至少为3的回文串。可以想到两个相同的数放两边长度以及是2了,那么只要两个相同数之间还有数,那么一定可以构成。
解题代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <string> #include <cstring> #include <map> #include <set> using namespace std; const long long N = 1e10 + 7; const int maxn = 2e5 + 5; const long long INF = 8e18; typedef long long ll; #define for0(i,n) for(int i = 0;i < n;i++) #define for1(i,n) for(int i = 1;i <= n;i++) map<int,int> ma; int main() { int t; cin >> t; while(t--){ int n,sign = 0; cin >> n; for1(i,n){ int x; cin >> x; if(ma[x] == 0) ma[x] = i; else{ if(i - ma[x] > 1) sign = 1; } } if(sign) cout << "YES" << endl; else cout << "NO" << endl; ma.clear(); } return 0; }
题目链接:https://vjudge.net/problem/CodeForces-1324C
思路:
可以默认起点和终点都是R ,所以只要就可以看出,只要找两个相近的R之间的最大距离,便可得到答案。
解题代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <string> #include <cstring> #include <map> #include <set> using namespace std; const long long N = 1e10 + 7; const int maxn = 2e5 + 5; const long long INF = 8e18; typedef long long ll; #define for0(i,n) for(int i = 0;i < n;i++) #define for1(i,n) for(int i = 1;i <= n;i++) map<int,int> ma; int main() { int t; string s1 = "R"; cin >> t; while(t--){ string s; int num = 0,sum = 0; cin >> s; s = s1 + s; s = s + s1; for(int i = 0;i < s.length();i++){ if(s[i] == 'L'){ sum++; } else{ num = max(num,sum); sum = 0; } } cout << num+1 << endl; } return 0; }