6.9-6.13VJ training
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;
}
} 


