Codeforces Round #706 (Div. 2)

简介: A.Split it!

A.Split it!


题意:判断一个字符串是否能使得这条件:s=a1+a2+…+ak+ak+1+R(ak)+R(ak−1)+…+R(a1).成立,并且R(abcd)=dcba。


思路:只需要从两头看,把中间看做a(k+1),所以只要两头相同的字符个数大于等于k即可。


#include<bits/stdc++.h>
using namespace std;
int main()
{
  int t,i,j,n,k;
  string s1;
  cin>>t;
  while(t--){
    cin>>n>>k>>s1;
//    cout<<s1.length()<<endl;
    if(k==0){
      cout<<"YES"<<endl;
    }
    else if(k+k+1>n){
      cout<<"NO"<<endl;
    }
    else {
      int cnt=0;
      for(i=0;i<s1.length()/2;i++){
        if(s1[i]==s1[s1.length()-1-i]){
          cnt++;
        }   
else {
          break;
        }   
      }
      if(cnt>=k){
        cout<<"YES"<<endl;
      }
      else {
        cout<<"NO"<<endl;
      }
    }
  }
}


B. Max and Mex


题意:有k次操作,每次操作将从0开始数第一个没出现的数字加上数组里出现最大的一个数相加除以2。


思路:乱搞一下能找到规律,因为数组里都是不重复的数,所以如果是一个从0开始的全排列,那么最后数就有n+1个,否则就判断(max+mex)/2所放入的新值有没有出现过并且要判断操作次数要有一次才行。


#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+1000;
int a[maxn];
int main()
{
  int t,i,j,n,k;
  cin>>t;
  while(t--){
    cin>>n>>k;
    map<int ,int >mo;
    for(i=0;i<n;i++){
      cin>>a[i];
      mo[a[i]]=1;
    }
    sort(a,a+n);
    int d1=0,max1=a[n-1];
    for(i=0;i<n;i++){
      if(d1==a[i]){
        d1++;
        continue;
      }
      else {
        break;
      }
    }
//cout<<d1<<" "<<max1<<endl;
    if(d1==max1+1){
      cout<<n+k<<endl;
    }
    else {
      int m1=(max1+d1)%2==0?(max1+d1)/2:(max1+d1)/2+1;
      if(mo[m1]==0&&k>=1){
        cout<<n+1<<endl;
      }
      else {
        cout<<n<<endl;
      }
    }
  }
}


C. Diamond Miner


题意:分别给你x轴上n个点和y轴上n个点,求两两相连所构成的三角形的斜边和最小。


思路:直接排序既可。


#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+1000;
double x[maxn],y[maxn];
bool cmp(double x1,double y1){
  return x1>y1;
}
int main()
{
  int t,i,j,n;
  scanf("%d",&t);
  while(t--){
    scanf("%d",&n);
    double sum=0;
    int cnt1=0,cnt2=0,x1,y1;
    for(i=0;i<2*n;i++){
      scanf("%d%d",&x1,&y1);
      if(x1==0) y[cnt1++]=abs(y1);
      if(y1==0) x[cnt2++]=abs(x1);
    }
    sort(y,y+n);
    sort(x,x+n);
    int zs1=0,zs2=n-1,ys1=0,ys2=n-1;
    for(i=0;i<n;i++){
      sum+=sqrt(x[i]*x[i]+y[i]*y[i]);
    }
  printf("%.16lf\n",sum);
  }
}
相关文章
|
27天前
|
人工智能 测试技术 BI
Codeforces Round 942 (Div. 2)
Codeforces Round 942 (Div. 2)
|
人工智能 算法 BI
Codeforces Round #179 (Div. 2)A、B、C、D
我们每次加进来的点相当于k,首先需要进行一个双重循环找到k点和所有点之间的最短路径;然后就以k点位判断节点更新之前的k-1个点,时间复杂度降到O(n^3),而暴力解法每次都要进行floyd,时间复杂度为O(n^4);相比之下前述解法考虑到了floyd算法的性质,更好了运用了算法的内质。
53 0
Codeforces Round #178 (Div. 2)
在n条电线上有不同数量的鸟, Shaass开了m枪,每一枪打的是第xi条电线上的第yi只鸟,然后被打中的这只鸟左边的飞到第i-1条电线上,右边的飞到i+1条电线上,没有落脚点的鸟会飞走。
50 0
|
机器学习/深度学习 Go
codeforces round 885 (div. 2)
codeforces round 885 (div. 2)
95 0
|
机器学习/深度学习 人工智能
Codeforces Round 889 (Div. 2)
Codeforces Round 889 (Div. 2)
154 0
Codeforces Round 835 (Div. 4)
Codeforces Round 835 (Div. 4) A~F题解
104 0
Codeforces Round 640 (Div. 4)
Codeforces Round 640 (Div. 4)A~G
91 0
Codeforces Round 849 (Div. 4)
Codeforces Round 849 (Div. 4)A~G2题解
114 0
|
人工智能 算法