首页 > 其他 > 详细

Codeforces Round #686 (Div. 3)

时间:2020-11-26 13:34:19      阅读:27      评论:0      收藏:0      [点我收藏+]

A. Special Permutation

题意:输出一个从1-n的全排列,下标从1开始,每一位下标与数值不等。

思路:输出2-n后再输出1.

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define pii pair<int,int>
 4 #define fi first
 5 #define se second
 6 #define pb push_back
 7 #define Swap(a,b) {int temp=a;a=b;b=temp;}
 8 typedef long long ll;
 9 typedef unsigned long long ull;
10  
11 int main(){
12     int test;
13     scanf("%d",&test);
14     while(test--){
15         int n;
16         scanf("%d",&n);
17         for(int i=1;i<n;i++){
18             printf("%d ",i+1);
19         }
20         printf("1\n");
21     }
22 }

 

B. Unique Bid Auction

题意:找到所有只出现过一次的元素中的最小值,假如找不到的话输出-1.

思路:题解的意思是记录每个元素的出现次数和任意一个出现位置,因为元素数据范围在1-2e5,可以从小到大遍历,把第一个出现次数为1的元素输出位置。我存了每个元素的所有位置再比大小,手滑少打了一个0,fst了。

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define Swap(a,b) {int temp=a;a=b;b=temp;}
typedef long long ll;
typedef unsigned long long ull;
map<int,vector<int> > num_pos;
int main(){
    int test;
    scanf("%d",&test);
    while(test--){
        int n;
        scanf("%d",&n);
        num_pos.clear();
        int tmp;
        for(int i=1;i<=n;i++){
            scanf("%d",&tmp);
            num_pos[tmp].pb(i);
        }
        int ans=200010,p=-1; //比赛的时候ans少打了一个0
        for(auto x:num_pos){
            auto num=x.fi;
            auto pos=x.se;
            if(pos.size()==1) {
                if(num<ans) p=pos[0],ans=num;
            }
        }
        printf("%d\n",p);
    }
}

 

C. Sequence Transformation

题意:选定一个元素,看它能把整个数组分成几块,输出最小能把数组分块的数量。

思路:统计每个元素的出现次数,分块数为出现次数+2,特判该元素是否出现在数组头或尾,假如有其中一种情况就让出现次数-1。

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define Swap(a,b) {int temp=a;a=b;b=temp;}
typedef long long ll;
typedef unsigned long long ull;
map<int,int> mp; //数字,次数
int a[200010];
int main(){
    int test;
    scanf("%d",&test);
    while(test--){
        int n,fi,ls;
        mp.clear();
        scanf("%d",&n);
        int tmp;
        for(int i=0;i<n;i++) {
            scanf("%d",&a[i]);
            if(i==0) fi=a[i]; //记录首个元素
            if(i==n-1) ls=a[i]; //记录末尾元素
            if(a[i]==a[i-1]) continue;
            mp[a[i]]++;
        }
        int ans=200000;
 
        for(auto x:mp){
            int num=x.fi,time=x.se;
            tmp=x.se+1;
            if(fi==num) tmp--; //特判是否在头尾
            if(ls==num) tmp--;
            ans=min(ans,tmp);
        }
        if(mp.size()==1) ans=0;
        printf("%d\n",ans);
    }
}

 

D. Number into Sequence

题意:给定一个n,求出几个数乘积为n,并且这几个数每一个都是前一个的倍数,求出最长的这样的序列并输出。

思路:每一个数都是前一个数的倍数,即第一个数是所有数的公因子。将n分解质因数,找到质因子里次数最高的,假设最高次数为k,输出先前k-1个质因子,最后一个该质因子和其他所有质因子之积相乘。特判如果所有质因子都只出现一次,答案为1,输出n本身。

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define Swap(a,b) {int temp=a;a=b;b=temp;}
typedef long long ll;
typedef unsigned long long ull;
 
unordered_map<ll,ll> primes; //哈希表存质因子/指数
 
void getprimes(ll x){ //分解质因子
    primes.clear();
    for(ll i=2;i<=x/i;i++){
        ll res=0;
        while(x%i==0){
            x/=i;
            res++;
        }
        if(res) primes[i]+=res;
    }
    if(x>1) primes[x]++; //最后没除尽
}
 
int main(){
    int test;
    scanf("%d",&test);
    while(test--){
        ll n;
        scanf("%lld",&n);
        getprimes(n);
 
        ll d,times=-1;
        for(auto prime:primes){
            ll a=prime.fi,b=prime.se;
            if(b>1){
                if(b>times) d=a,times=b;
            }
        }
        if(times!=-1){
            int cnt=0;
            while(times>1){
                cnt++;
                n/=d;
                times--;
            }
            printf("%d\n",cnt+1);
            while(cnt--) printf("%d ",d);
            printf("%lld\n",n);
        }
        else printf("1\n%lld\n",n);
    }
}

 

E待补……

Codeforces Round #686 (Div. 3)

原文:https://www.cnblogs.com/CandyLynch/p/14041202.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!