A. Integer Moves
题意:
在平面直角坐标系上存在一个点(x,y),可以进行平移操作,要求每次移动后前后两点的坐标的距离开平方是整数
思路:
整理发现要么一次到位要么就需要两次变化,当然特判一下0的情况
#include<bits/stdc++.h> using namespace std; int main() { int n,i,j,t,a,b; cin>>t; map<int ,int >d1; for(i=0;i<=1050;i++){ d1[i*i]=1; } while(t--) { cin>>a>>b; if(a==0&&b==0) { cout<<0<<endl; } else if(d1[a*a+b*b]!=0) { cout<<1<<endl; } else { cout<<2<<endl; } } return 0; }
B. XY Sequence
题意:
构造一个长度为n的数列,要求他们的和不超过最大,并且单个元素不超过B,且a[i]=a[i-1]+x或者是a[i]=a[i-1]-y。
思路:
贪心的构造只要当前可以取,就想办法取它最大的,可以取的情况介绍a[i]<=B
#include<bits/stdc++.h> using namespace std; const int maxn=2e5+1000; long long a[maxn]; int main() { int n,i,j,t,B,x,y; cin>>t; while(t--) { cin>>n>>B>>x>>y; for(i=0;i<n+1;i++) { if(i==0) a[i]=0; else { if(a[i-1]+x<=B&&a[i-1]-y<=B) { a[i]=max(a[i-1]+x,a[i-1]-y); } else { if(a[i-1]+x>B) { a[i]=a[i-1]-y; } else { a[i]=a[i-1]+x; } } } } long long ans=0; for(i=0;i<n+1;i++) { ans+=a[i]; // cout<<a[i]<<" "; } cout<<ans<<endl; } return 0; }
C. Bracket Sequence Deletion
题意:
给你一个只包含'(', ')'两种字符的字符串,每次操作选择它的最短前缀,如果最短前缀串是回文串或者是可以完成括号匹配的串,就可以进行抵消。
思路:
分析可得,要么最短前缀是(),或者((,)),剩下一种情况就是)开头的,不难发现如果是)开头的,只有当出现第二个),才能完成回文串抵消的操作,而且一定可以将中间全部抵消,所以直接模拟即可。
#include<bits/stdc++.h> using namespace std; bool check(string s2) { for(int i=0;i<s2.length()/2;i++) { if(s2[i]!=s2[s2.length()-i-1]) { return false; } } return true; } int main() { int n,i,j,t; string s1,s2; cin>>t; while(t--) { int f1=0,ans=0; cin>>n>>s1; i=0;s2=""; while(i<n) { s2+=s1[i]; if(s2[0]==')') { if(s1[i]==')') f1++; if(f1==2) { ans++; s2=""; f1=0; } } else { if(s2.length()==2) { ans++; s2=""; f1=0; } } i++; } cout<<ans<<" "<<s2.length()<<endl; } return 0; }