1. 程式人生 > >Codeforces Round #560 div3 (C,D)

Codeforces Round #560 div3 (C,D)

clu 全部 排序 -- mes 成對 long long lse iostream

C

  • 題目大意: 給出一個字符串,可以刪除任意位置上的字符,得到一個好字符串. 長度為偶數,且奇數位置i上的字符與\(i+1\)上的字符不相等. 求最小的操作次數
  • 思路: 暴力,遇到奇數位置與後面位置相同直接刪除,註意是答案字符串上的奇數位置
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
#include<map>
#define ll long long 
#define FOR(i,n) for(int i =1; i <= n;++i ) 
#define FOR0(i,n) for(int i =0; i < n;++i )  
#define inf 0x3f3f3f3f
using namespace std; 

const int maxn = 2e5+10;
char buf[maxn];
char ans[maxn];
int n;

int main(){
    cin >> n;
    if(n==0){
        cout << 0 << endl << endl;
        exit(0);    //長度為0
    }
    cin >>buf;
    int cur = 0;
    for(int i=0;i<n;++i){
        if(cur%2==0){
            while(buf[i+1]==buf[i]) i++;
        }
        ans[cur++] = buf[i];
    }
    ans[cur] = 0;
    int ccur =cur;// 保證長度為偶數
    ccur= ccur/2*2;
    ans[ccur] = 0;
    cout << n-ccur<<endl<<ans <<endl;
    return 0;
}

D

  • 題目大意: 給出一個序列,判斷是否為一個數的幾乎全部因數(除去1和該數本身).
    要判斷是否滿足所有因子,且所有因子都來自於一個數
  • 思路: 暴力,一個數的因子肯定成對出現. 給因子排序 判斷是否所有\(a[i]*a[n-i+1]\) 都相等,如果相等在計算因子數量是否滿足序列長度,當答案是平方數是要特殊判斷一下.
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<map>
#define ll long long 
#define FOR(i,n) for(int i =1; i <= n;++i ) 
#define FOR0(i,n) for(int i =0; i < n;++i )  
#define inf 0x3f3f3f3f
using namespace std; 

const int maxn = 310;
ll a[maxn];
int n;
ll cans;
int judge(){
    if(n==1){
        cans = a[1]*(ll)a[1];
        return 1;
    }
    cans = a[1]*1LL*a[n];
    for(int i=2;i<=n/2;++i){
        if(a[i]*a[n-i+1]!=cans) return 0;
    }
    if(n%2==1 && a[n/2+1]*a[n/2+1]!=cans)   return 0;   //當n為奇數 特判中間數的平方
    return 1;
}
int main(){
    int orz;
    cin >> orz;
    while(orz--){
        cin >> n;
        FOR(i,n){
            cin >> a[i];
        }
        sort(a+1,a+1+n);
        if(judge()!=0){
            int cnt = 0;
            for(ll i=2;i*i<cans;++i){
                if(cans%i==0){
                    cnt++;
//                  cout << i << endl;
                }
            }
            cnt*=2;
            if((ll)sqrt(cans)*(ll)sqrt(cans)==cans) cnt++;
            if(cnt==n)  cout << cans << endl;
            else cout << -1 << endl;
        }else{
            cout << -1 <<endl;
        }       
    }

    return 0;
}

Codeforces Round #560 div3 (C,D)