A题
只要n和k是相同的奇偶性,并且k的平方大于等于n即可,因为等差数列化简一下就是k方,只要n小于k方就可以被表示出来
#include<bits/stdc++.h> using namespace std; bool judge(long long n,long long k) { if(n%2==0&&k%2==0||n%2==1&&k%2==1) return true; else return false; } int main() { int t; cin>>t; while(t--) { unsigned long long n,k; cin>>n>>k; if(judge(n,k)&&n>=k*k) cout<<"YES"<<endl; else cout<<"NO"<<endl; } }B题
开三个数组,分别储存公主是否已婚,王子是否已婚,和公主的最佳搭配,之后遍历匹配就完了,匹配到一个就跳出找下一个公主,最后根据情况输出就行
#include<bits/stdc++.h> using namespace std; int p[100010],ps[100010]; int best[100010]; int main(){ int t; cin >> t; while(t--){ int n; cin >> n; for (int i = 1; i <= n;i++){ ps[i]=0; p[i]=0; best[i]=0; } for(int i = 1;i <= n;i++){ int x; cin >> x; for(int j = 1;j <= x;j++){ cin >>best[j]; } for(int k = 1;k <= x;k++){ if(p[best[k]] == 0){ p[best[k]] = 1; ps[i] = 1; break; } } } int flag = 0; for(int i = 1;i <= n;i++){ if(ps[i] == 0){ cout << "IMPROVE" << endl; for(int j = 1;j <= n;j++){ if(p[j] == 0){ cout << i << ' ' << j << endl; flag = 1; } if(flag == 1)break; } } if(flag == 1)break; } if(flag == 0){ cout << "OPTIMAL" << endl; } } }C题
直接输出1和结果-1就行
#include<bits/stdc++.h> using namespace std; int main() { long long a,b; int t; cin>>t; while(t--) { long long res; cin>>res; cout<<1<<" "<<res-1<<endl; } }
D题
用set去重最后输出数量就行
#include<bits/stdc++.h> using namespace std; int main() { set<int > s; int t; cin>>t; while(t--) { s.clear(); int n; cin>>n; int i; for(i = 0;i < n;i++) { int a; cin>>a; s.insert(a); } cout<<s.size()<<endl; } }
F题
直接判断这一组数是否与第一个数具有相同的奇偶性,如果都是奇数或者都是偶数就可以
#include<bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while(t--) { int n; int flag = 1; cin>>n; int a[n]; int i; for(i = 0;i < n;i++) cin>>a[i]; if(a[0]%2==0) { for(i = 1;i<n;i++) { if(a[i]%2!=0) { flag=0; break; } } } else { for(i = 1;i<n;i++) { if(a[i]%2==0) { flag=0; break; } } } if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl; } }G题
只要找到两个相同的数字并且他们不相邻就行
#include<bits/stdc++.h> using namespace std; 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题
让小青蛙向右跳的时候的步数是连续L的最大长度就行,遍历字符串数出来最大的连续L的长度
#include<bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while(t--) { string s; int time = 0,m = 0; cin>>s; int i; for(i = 0;i < s.length();i++) { if(s[i]=='L'){ time++; m = max(time,m); } else time = 0; } cout<<m+1<<endl; } }