2020.06.09——习题训练五
作者:互联网
题意:给你一个n和k,让你判断这个n能否由k个奇数构成
思路:第一眼感觉不会,然后有个同学说,先看看k个最小能组的数是多少,于是一算是k^2,也就是说当n<k^2时,是不能成功的,但问题是当n>=k^2时,却不一定能成功,那么怎么能成功,k个奇数, 变化是k^2加上一个偶数,也就是说,k^2为奇数,加偶数为奇数,n为奇数,否则就是偶数,所以k和n奇偶性相同
代码:
#include <bits/stdc++.h> using namespace std; #define N 1000000 #define ll long long int main(){ int t; cin>>t; while(t--){ ll n,k; cin>>n>>k; if((n>=k*k)&&(n%2==k%2))cout<<"YES"<<endl; else cout<<"NO"<<endl; } }
题意:意思就是,有n个公主,n个王子,让你去给每一位公主匹配王子。其中每位公主都有心目中的王子,在这个基础上进行匹配。
如果这样就可以让n个公主找到自己的王子,那么就输出“OPTIMAL”,否则输出任意一个 没有找到王子的公主 以及其能够匹配的王子。
当然,一位公主只能匹配一位王子。
思路:说实话,,这道题我没做出来,看了别人的才会
代码:
#include<bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while(t--) { int n; cin>>n; set<int> st; for(int i=1; i<=n; i++) st.insert(i);//n个公主,n个王子 int d,v,flag=0; for(int i=1; i<=n; i++)//公主数 { int m; cin>>m; int f=0; for(int j=1; j<=m; j++)//公主心中王子 { int x; cin>>x; if(st.find(x)!=st.end()&&f==0)//在集合里找王子 { st.erase(x); f++; } } if(f==0) { d=i;//公主没找到,标记公主 flag=1; } } if(flag==1) { cout<<"IMPROVE"<<endl; cout<<d<<" "<<*(st.begin())<<endl;//集合里还剩下的 } else cout<<"OPTIMAL"<<endl; } return 0; }
题意:给你一个数x,找到两个数,使这俩数的最大公约数和最小公倍数之和等于x,并输出这两数
思路:先上来,按常规想,从一开始遍历,结果在test 3超时了,然后发现有人告诉我GCD(1,n)=1,LCM(1,n)=n,所以我们把n换成n−1,那么最终答案是不是就是1,n-1了
#include <bits/stdc++.h> using namespace std; #define N 1000000 #define ll long long /*int gcd(int a,int b)//辗转相除法(欧几里德算法)求最大公约数 { return b ? gcd(b,a%b) : a; } int lcm(int a,int b) { return a*b/gcd(a,b);//最小公倍数 }*/ //lmc/gcd一定能除尽,因为最小公倍数/最大公约数 //所以分为两部分 int main(){ int t; cin>>t; while(t--){ int n,w=0; cin>>n; /*for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if((gcd(i,j)+lcm(i,j))==n){ cout<<i<<" "<<j<<endl; w=1; break; } } if(w==1)break; }*/ for(int i=1;i<n;i++){ if(n%i==0){ cout<<i<<" "<<n-i<<endl; break; } } } }
D - CopyCopyCopyCopyCopy
题意:给你一组数,使其循环后,删除某些数,使其成为不重复的递增序列
思路:一定是里面的数,排序去重即可,set我用了
#include <bits/stdc++.h> using namespace std; #define N 1000000 #define ll long long set<int> s; int main(){ int t; cin>>t; while(t--){ s.clear(); int n,x; cin>>n; for(int i=1;i<=n;i++){ cin>>x; s.insert(x); } cout<<s.size()<<endl; } }
F - Yet Another Tetris Problem
题意:像俄罗斯方块,但是每次加两块,看能否全部消去
思路:找到最高的和最低的,看差是否为2的倍数就行
#include <bits/stdc++.h> using namespace std; #define N 1000000 #define ll long long int a[N]; int main(){ int t; cin>>t; while(t--){ int n,max1=-100,w=0; cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; max1=max(max1,a[i]); } for(int i=0;i<n;i++){ if((max1-a[i])%2!=0){ cout<<"NO"<<endl; w=1; break; } } if(w==0)cout<<"YES"<<endl; } }
G - Yet Another Palindrome Problem
题意:有一个数组,问能否删去一些数使它成为长度至少为3的回文字符串。
思路:是三,能成回文就好,好像能删
#include <bits/stdc++.h> using namespace std; #define N 1000000 #define ll long long int a[N]; int main(){ int t; cin>>t; while(t--){ int n,w=0; cin>>n; for(int i=0;i<n;i++) cin>>a[i]; for(int i=0;i<n-2;i++){ for(int j=i+2;j<n;j++){ if(a[i]==a[j]){ cout<<"YES"<<endl; w=1; break; } } if(w==1)break; } if(w==0)cout<<"NO"<<endl; } }
题意:青蛙每个位置标有L,R表示青蛙只能向左和向右跳,每次最多能跳m个长度,求m的最小值。
思路:本题我不会做,胡蒙的,,看样例的时候发现,所输出的数是连续的最长的r的长度加一,没想到过了
#include<bits/stdc++.h> using namespace std; int main(){ int n; cin>>n; while(n--){ string s; cin>>s; int w=s.size(); int p=0,max1=-1111; for(int i=0;i<w;i++){ if(s[i]=='R')p=0; else p++; max1=max(max1,p); } cout<<max1+1<<endl; } }
标签:题意,int,09,cin,long,2020.06,习题,main,define 来源: https://www.cnblogs.com/1324a/p/13125440.html