2020.6.9 习题练习五
作者:互联网
A - Sum of Odd Integers
题意:给出n和k,问n是否能表示为k个不同的奇数的和
做法:根据规律,n和k如果奇偶性不同是无法满足题意的,而且k个正奇数相加的最小数字一定等于k * k,所以如果k * k>n的话也不满足题意,只需要判断这些条件即可
代码:
//去吧马里奥!把AC公主救回来! // ******** // ************ // ####....#. // #..###.....##.... // ###.......###### // ........... // ##*####### // ####*******###### // ...#***.****.*###.... // ....**********##..... // ....**** *****.... // #### #### // ###### ###### #include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<string> #include<map> #include<sstream> #include<cstring> #include<vector> #include<iomanip> #include<queue> #include<set> #define LL long long #define _64 __int64 const double PI = atan(1.)*4.; using namespace std; int main(){ int t; cin >> t; while(t--){ LL n,k; cin >> n >> k; if(((n % 2 == 0 && k % 2 == 0) || (k % 2 == 1 && n % 2 == 1)) && n >= k*k){ cout << "YES" << endl; }else{ cout << "NO" << endl; } } }
B - Princesses and Princes
题意:题干劈里啪啦一大堆,其实就是说给公主和王子找对象,每个公主喜欢的王子不一样,每个公主只能和一个王子配对,问能不能全部配成功,不能就手动配一对,随便哪对都行
做法:开三个数组,分别储存公主有没有对象,王子有没有,和公主的意愿,之后遍历匹配就完了,匹配到一个就跳出找下一个公主,最后根据情况输出就行,还有就是这个用memset铁定会超时,需要用循环进行数组初始化
代码:
//去吧马里奥!把AC公主救回来! // ******** // ************ // ####....#. // #..###.....##.... // ###.......###### // ........... // ##*####### // ####*******###### // ...#***.****.*###.... // ....**********##..... // ....**** *****.... // #### #### // ###### ###### #include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<string> #include<map> #include<sstream> #include<cstring> #include<vector> #include<iomanip> #include<queue> #include<set> #define LL long long #define _64 __int64 const double PI = atan(1.)*4.; using namespace std; int g[200005],w[200005],wish[200005]; int main(){ int t; cin >> t; while(t--){ //memset(g,0,sizeof(g)); //memset(w,0,sizeof(w)); //memset(wish,0,sizeof(wish)); int n; cin >> n; for (int i = 1; i <= n;i++){ g[i]=0; w[i]=0; wish[i]=0; } for(int i = 1;i <= n;i++){ int x; cin >> x; for(int j = 1;j <= x;j++){ cin >> wish[j]; } for(int k = 1;k <= x;k++){ if(w[wish[k]] == 0){ w[wish[k]] = 1; g[i] = 1; break; } } } int flag = 0; for(int i = 1;i <= n;i++){ if(g[i] == 0){ cout << "IMPROVE" << endl; for(int j = 1;j <= n;j++){ if(w[j] == 0){ cout << i << ' ' << j << endl; flag = 1; } if(flag == 1)break; } } if(flag == 1)break; } if(flag == 0){ cout << "OPTIMAL" << endl; } } }
C - EhAb AnD gCd
题意:给你x,要求GCD(a,b)+LCM(a,b)=x
做法:GCD是可以被a和b整除的最大数,LCM是可以整除a和b的最小数,之后我们知道GCD(a,1)=1,LCM(1,a)=a,由此可知,最后要等于x,那把a换成a-1就行,也就是直接输出x-1和1就行
代码:
//去吧马里奥!把AC公主救回来! // ******** // ************ // ####....#. // #..###.....##.... // ###.......###### // ........... // ##*####### // ####*******###### // ...#***.****.*###.... // ....**********##..... // ....**** *****.... // #### #### // ###### ###### #include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<string> #include<map> #include<sstream> #include<cstring> #include<vector> #include<iomanip> #include<queue> #include<set> #define LL long long #define _64 __int64 const double PI = atan(1.)*4.; using namespace std; int main(){ int t; cin >> t; while(t--){ int n; cin >> n; cout << n-1 << ' ' << 1 << endl; } }
D - CopyCopyCopyCopyCopy
题意:有一个数组长度为n,要求n个这样的数组链接在一起,通过删去一部分数得到最长的递增序列
做法:先链接(其实也不用),直接用其中一段就行,因为是重复的,从第一组找最小的,第二组找第二小的……
之后其实直接用一组之后去重就可以了,而且关键是题目要求输出的是序列长度,直接排序之后用去重unique跑一下就ok
代码:
//去吧马里奥!把AC公主救回来! // ******** // ************ // ####....#. // #..###.....##.... // ###.......###### // ........... // ##*####### // ####*******###### // ...#***.****.*###.... // ....**********##..... // ....**** *****.... // #### #### // ###### ###### #include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<string> #include<map> #include<sstream> #include<cstring> #include<vector> #include<iomanip> #include<queue> #include<set> #define LL long long #define _64 __int64 const double PI = atan(1.)*4.; using namespace std; int a[200005]; int main(){ int t; cin >>t; while(t--){ int n; cin >> n; for(int i = 0;i < n;i++){ cin >> a[i]; } sort(a,a+n); int num; num = unique(a,a+n)-a; cout << num << endl; } }
F - Yet Another Tetris Problem
题意:俄罗斯方块,有n个数,从左到右表示这个位置有几个方块,现在可以给每个位置叠方块,一次只能加上两个方块,问能不能将所有方块消除
做法:先排序找出最大的,之后将剩下的挨个和最大的比较,如果差值为奇数那就不可能了
代码:
//去吧马里奥!把AC公主救回来! // ******** // ************ // ####....#. // #..###.....##.... // ###.......###### // ........... // ##*####### // ####*******###### // ...#***.****.*###.... // ....**********##..... // ....**** *****.... // #### #### // ###### ###### #include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<string> #include<map> #include<sstream> #include<cstring> #include<vector> #include<iomanip> #include<queue> #include<set> #define LL long long #define _64 __int64 const double PI = atan(1.)*4.; using namespace std; int a[20005]; int main(){ int t; cin >> t; while(t--){ int n; cin >> n; for(int i = 0;i < n;i++){ cin >> a[i]; } sort(a,a+n); int num; int flag = 0; for(int i = 0;i < n;i++){ num = a[n-1]-a[i]; if(num % 2 == 1){ cout << "NO" << endl; flag = 1; break; } } if(flag == 0){ cout << "YES" << endl; } } }
G - Yet Another Palindrome Problem
题意:给一个数组,问能否删去一些数使其变成长度至少为3的回文串
做法:只需要直接判断是否存在长度为3的回文就行,从头开始判断即可,用两个循环
代码:
//去吧马里奥!把AC公主救回来! // ******** // ************ // ####....#. // #..###.....##.... // ###.......###### // ........... // ##*####### // ####*******###### // ...#***.****.*###.... // ....**********##..... // ....**** *****.... // #### #### // ###### ###### #include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<string> #include<map> #include<sstream> #include<cstring> #include<vector> #include<iomanip> #include<queue> #include<set> #define LL long long #define _64 __int64 const double PI = atan(1.)*4.; using namespace std; int a[20005]; int main(){ int t; cin >> t; while(t--){ int n; cin >> n; for(int i = 0;i < n;i++){ cin >> a[i]; } int flag = 0; for(int i = 0;i < n-2;i++){ for(int j = i+2;j < n;j++){ if(a[i] == a[j]){ cout << "YES" << endl; flag = 1; break; } } if(flag == 1){ break; } } if(flag == 0){ cout << "NO" << endl; } } }
H - Frog Jumps
题意:一只青蛙,在0的位置,要跳到n+1的位置,中间有长度为n,包含L或R的字符串,L往左跳,R往右跳,最多能跳d米,问在保证能跳到最右面的情况下,d的最小值
做法:因为是要往右跳,所以R才是关键,因此只要求出相邻的r之间的最大值就是至少要跳的距离
代码:
//去吧马里奥!把AC公主救回来! // ******** // ************ // ####....#. // #..###.....##.... // ###.......###### // ........... // ##*####### // ####*******###### // ...#***.****.*###.... // ....**********##..... // ....**** *****.... // #### #### // ###### ###### #include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<string> #include<map> #include<sstream> #include<cstring> #include<vector> #include<iomanip> #include<queue> #include<set> #define LL long long #define _64 __int64 const double PI = atan(1.)*4.; using namespace std; int main(){ int t; cin >> t; while(t--){ string s; cin >> s; int ans = 0; int lo = -1; int n = s.size(); for(int i = 0;i < n;i++){ if(s[i] == 'R'){ ans = max(i-lo,ans); lo = i; } } ans = max(n-lo,ans); cout << ans << endl; } }
标签:int,2020.6,练习,....,cin,####,######,习题,include 来源: https://www.cnblogs.com/CCCCrack/p/13111612.html