7.15 N,O,P,Q Codeforces 691 A,B,C,D

来源:互联网 发布:激光slam算法 编辑:程序博客网 时间:2024/05/16 18:26

N - Fashion in Berland

题意:一道水题。

思路:简单模拟。

代码:

#include <iostream>using namespace std;int n;int main(){    cin>>n;    if(n==1){        cin>>n;        cout<<(n==0?"NO":"YES")<<endl;    }    else{        int c,cnt=0;        for(int i=0;i<n;i++){            cin>>c;            if(c==0) cnt++;            if(cnt>1) {cout<<"NO"<<endl;return 0;}        }        cout<<(cnt==0?"NO":"YES")<<endl;    }    return 0;}

O - s-palindrome

题意:判断一段字符串是镜像回文串或不是。

思路:使用镜像字符数组。

代码:

#include <bits/stdc++.h>using namespace std;char MIR[]="A      HI   M O    TUVWXY ";char mir[]=" d b          oqp    vwx  ";char r(char x){    if(isupper(x))        return MIR[x-'A'];    else        return mir[x-'a'];}int main(){    string str;    cin>>str;    for(int i=0;i<str.size();i++){        if(r(str[i])!=str[str.size()-1-i]){cout<<"NIE"<<endl;return 0;}    }    cout<<"TAK"<<endl;    return 0;}


P - Exponential notation
题意:将给的任意数字,含小数转换为科学计数法。
思路:模拟,细节非常多。
#include <bits/stdc++.h>using namespace std;string str;int main(){    cin>>str;    int pos=str.size();    for(int i=0;i<str.size();i++)        if(str[i]=='.'){pos=i;break;}    int l0,r0;    for(l0=0;l0<pos;l0++)        if(str[l0]!='0') break;    for(r0=str.size()-1;r0>pos;r0--)        if(str[r0]!='0') break;    if(r0!=str.size()-1) str.erase(r0+1,str.size()-r0-1);    if(l0!=0) str.erase(0,l0);    pos=str.size();    for(int i=0;i<str.size();i++)        if(str[i]=='.'){pos=i;break;}    int pos2=-1;    for(int i=0;i<str.size();i++)        if(str[i]!='0'&&str[i]!='.'){pos2=i;break;}    if(pos!=str.size())str.erase(pos,1);    for(l0=0;l0<pos;l0++)        if(str[l0]!='0') break;    if(l0!=0) str.erase(0,l0);    if(str.size()!=1)str.insert(1,".");    if(pos-pos2==1)cout<<str<<endl;    else if(pos-pos2>1) {        for(r0=str.size()-1;r0>1;r0--)            if(str[r0]!='0') break;        if(r0!=str.size()-1) str.erase(r0+1,str.size()-r0-1);        if(str.size()==2) str.erase(1,1);        cout<<str<<'E'<<pos-pos2-1<<endl;    }    else if(pos-pos2<1){        if(str[0]=='0') str.erase(0,2);        for(l0=0;l0<str.size();l0++)            if(str[l0]!='0') break;        if(l0!=0) str.erase(0,l0);        if(str.size()!=1&&str[1]!='.')str.insert(1,".");        cout<<str<<'E'<<pos-pos2<<endl;    }    return 0;}

Q - Swaps in Permutation

题意:给出某些位置上的数是可以互相交换的。求出最终能交换得到的字典序最大的序列

思路:用并查集维护可交换的位置,用集合维护处于同一并查集的元素。每次从后往前从集合中取出元素。

代码:

#include <bits/stdc++.h>using namespace std;const int maxn=1000001;set<int> S[maxn];int p[maxn],a[maxn],n,m;int find(int x){return p[x]==x?x:p[x]=find(p[x]);}int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++){        scanf("%d",&a[i]);        p[i]=i;    }    for(int i=1;i<=m;i++){        int x,y,fx,fy;        scanf("%d%d",&x,&y);        fx=find(x);        fy=find(y);        if(fx!=fy) p[fx]=fy;    }    for(int i=1;i<=n;i++){        S[find(i)].insert(a[i]);    }    for(int i=1;i<=n;i++){        printf("%d ",*S[find(i)].rbegin());        S[find(i)].erase(*(S[find(i)].rbegin()));    }    return 0;}

0 0