contest 1165(div 3)

C. Good String

题意描述:

给你一个空串,问你能否通过删除其中的某些字母使得这个串变成“Good String”,“Good String”的条件是:1。这个串为空,2.这个串的长度为偶数且在这个串中奇数位置的字符与它接下来的偶数位置的字母不同。

第一行输出删除的字母,第二行输出所获得的“Good String”。

思路:

贪心,如果当前所获得的“Good String”的长度为偶数,那无论当前串中的字母是什么,都可以加入到所构造的“Good String”中,若为奇数,则需要判断它与其前面的字母是否相同,如果相同,就跳过,否则,就将其加入到“Good String” 中。最后,如果串长为奇数,则需要去掉最后一个字母。

AC代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+5;
char s[maxn],ans[maxn];
bool sta[maxn];
int main()
{
  int n;
  scanf("%d",&n);
  scanf("%s",s);
  int len = 0;
  for(int i = 0;i<n;i++)
  {
      if(len%2==0)
      {
          ans[len++]=s[i];
      }
      else
      {
          //cout << s[i] << " " << ans[len-1] <<endl;
          if(s[i]!=ans[len-1])
            ans[len++] = s[i];
      }
  }
  //cout << ans <<endl;
  if(len%2==1)
    len--;
  cout << n - len << endl;
  for(int i = 0;i<len;i++)
    cout << ans[i];
  cout <<endl;
    return 0;
}

D. Almost All Divisors

题面描述:
给你一个数组,这个数组的数都是某个数X除了1和X这两个因子以外的因子,问你能否通过这个给定的数组来推断出这个数X来,如果可以的话输出符合条件且最小的数X,否则输出-1。

思路:

首先我们知道,设x1*x2 = x, x1<x2,d = sqrt(x),则必然有x1<=d且x2>=d,因此我们要对它给出的数组进行排序,排完序后X的每对因子都关于数组中心呈对称关系,所以我们可以以第一个和最后一个的乘积为X的值,并以它为标准检查数组中剩下的值,若有一个不符合,则证明X不存在。输出-1即可,若都符合,则还有另一种情况,那就是数组中的元素都是X的因子,但X的因子不全在数组中,因此我们可以计算出符合条件X的因子个数,并将它与数组长度作比较。若相同则输出X,若不同则输出-1。

AC代码:

注意,要交C++14 否则可能会卡sqrt的精度

#include <bits/stdc++.h>
using namespace std;
const int maxn = 305;
typedef long long LL;
LL num[maxn];
//void f(int n)
//{
//    int len = 0;
//    for(int i = 2;i<sqrt(n);i++)
//    {
//        if(n%i==0)
//        {
//            num[len++] = i;
//            num[len++] = n/i;
//        }
//    }
//    if(sqrt(n)*sqrt(n)==n)
//        num[len++] = sqrt(n);
//    sort(num,num+len);
//    if(len!=0)
//    printf("%d",num[0]);
//    for(int i = 1;i<len;i++)
//        printf(" %d",num[i]);
//    printf("\n");
//}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        for(int i = 0; i<n; i++)
            cin >> num[i];
        sort(num,num+n);
        bool flag = true;
        LL x = num[0]*num[n-1];
        for(int i = 1,j = n-2; i<=j; i++,j--)
        {
            if(num[i]*num[j]!=x )
            {
                //cout << num[i] << " " << num[j] <<endl;
                flag = false;
                break;
            }
        }
        if(flag)
        {
            int sum = 0;
            for(int i = 2;i<sqrt(x);i++)
            {
                if(x%i==0)
                    sum+=2;
            }
            if(sqrt(x)*sqrt(x)==x)
                sum++;
            if(sum==n)
            cout << x <<endl;
            else
                cout << -1 <<endl;
        }
        else
        {
            cout << -1 << endl;
        }
    }
//    for(int i = 2;i<=100;i++)
//    {
//        printf("%d: ",i);
//        f(i);
//    }
    return 0;
}

 

posted @ 2019-06-11 15:26  浅花迷人  阅读(138)  评论(0编辑  收藏  举报