2020年“远光杯”粤澳计算机程序设计大赛网络资格赛 题解1

2020年“远光杯”粤澳计算机程序设计大赛网络资格赛 题解2

由于题目太多分成两篇文章总结,这一篇是前 1 至 10题。
加上代码头文章太长,所以把模板放在最后。

如果有什么讲的不清楚的欢迎留言私信交流~

文章目录

  • A . Alice的秘密
  • B . 今天星期几
  • C . 小明的英文作业
  • D . 分三排
  • E . 击中目标
  • F . 序列计数
  • G . 强迫症
  • H . 新型冠状爱情病毒
  • I . 期末表彰
  • J . 最小特征
  • ends: 代码头

A . Alice的秘密

思路:模拟就好,讲讲坑点:

  1. 时间可能是个字符串,并且里面不是数字。
  2. 第二个字符串可能包含其他字符。

代码

const int manx=1e6+5;

ll day[13]={
     0,31,28,31,30,31,30,31,31,30,31,30,31};

bool pdsb(string s){
     
    if(s.size()!=8) return true;
    for(int i=0;i<s.size();i++){
     
        if(s[i]<='9'&&s[i]>='0') continue;
        else return true;
    }
    ll year=0,mon=0,da=0;
    for(int i=0;i<4;i++) year=year*10+(s[i]-'0');
    if(year<1900||year>2020) return true;

    for(int i=4;i<6;i++) mon=mon*10+(s[i]-'0');
    if(mon<1||mon>12) return true;

    for(int i=6;i<8;i++) da=da*10+(s[i]-'0');
    ll sb=day[mon];
    if(mon==2 && (year%400==0||(year%4==0&&year%100))) sb++;
    if(da<1||da>sb) return true;
    return false;
}
bool pds(string s){
     
    for(int i=0;i<s.size();i++){
     
        if(s[i]<='z'&&s[i]>='a') continue;
        else if(s[i]<='Z'&&s[i]>='A') continue;
        else if(s[i]==' ') continue;
        else return true;
    }
    return false;
}
int main(){
     
    string sb,s;
    while(cin>>sb){
     
        ll k=0;
        getchar(); getline(cin,s);
        if(pdsb(sb)||pds(s)){
     
            cout<<"none"<<endl;
            continue;
        }
        for(int i=0;i<sb.size();i++) k+= sb[i]-'0';
        while(k>=10){
     
            ll x=0;
            while(k){
     
                x+=k%10; k/=10;
            }
            k=x;
        }
        ll n=s.size();
        for(int i=0;i<n;i++){
     
            if(s[i]==' ') cout<<'#';
            if(s[i]>='a'&&s[i]<='z'){
     
                cout<<
                (char)(((s[i]-'a'+k)%26)+'a')
                ;
            }
            if(s[i]>='A'&&s[i]<='Z'){
     
                cout<<
                (char)(((s[i]-'A'+k)%26)+'A')
                ;
            }
        }
        cout<<endl;
    }
    return 0;
}

B . 今天星期几

思路:模拟就好,注意判断每一年是否是闰年,然后一年一年减下去就可以。

代码

ll day[13]={
     0,31,28,31,30,31,30,31,31,30,31,30,31};

ll a,b,c,s;

void pd(ll a){
     
    if(a%4==0&&a%100){
     
        s-=day[2]; day[2]=29; s+=day[2];
    }
    else if(a%400==0){
     
        s-=day[2]; day[2]=29; s+=day[2];
    }
    else{
     
        s-=day[2]; day[2]=28; s+=day[2];
    }
}
void cal(){
     
    ll cnt=0;
    for(int i=1;i<b;i++) cnt+=day[i];
    cnt+=c;
    --a;
    while(a>=2000){
     
        pd(a);
        cnt+=s;
        a--;
    }
    ll d=cnt/4;
    if(cnt%4) d++;
    cout<<d<<" ";
    if(cnt%4==1) cout<<1<<endl;
    else if(cnt%4==2) cout<<2<<endl;
    else if(cnt%4==3) cout<<3<<endl;
    else cout<<4<<endl;
}

int main(){
     
    for(int i=1;i<=12;i++) s+=day[i];
    while(cin>>a>>b>>c){
     
        pd(a);
        cal();
    }
    return 0;
}

C . 小明的英文作业

思路:map统计单词出现次数,判断出现次数为1的单词是否大于n/2。

代码

map<string,ll>vis;
int main(){
     
    string s;
    while(1){
     
        getline(cin,s);
        if(s[0]=='#') break;
        vis.clear();
        ll cnt=1;
        ll k=0;
      //  cout<
        for(int i=0;i<s.length();i++){
     
            if(s[i]!=' ') continue;
            string c="";
            for(int j=k;j<i;j++)
                c+=s[j];
            vis[c]++; cnt++; k=i+1;
        //    cout<
        }
        string c="";
        for(int j=k+1;j<s.size();j++)
                c+=s[j];
        vis[c]++; cnt++;
        ll ans=0;
        for(auto x: vis){
     
            if(x.second==1) ans++;
        }
       // cout<
        if(ans>=cnt/2) put1();
        else put2();
    }
    return 0;
}

D . 分三排

思路:对3取余然后分情况输出。

代码


vector<ll>g[5];

int main(){
     
	ll n;  io;  cin>>n;
	//while(cin>>n){
     
        g[1].clear(); g[2].clear(); g[3].clear();
        for(int i=1;i<=n;i++){
     
            ll x; cin>>x;
            g[i%3].pb(x);
        }
        for(int i=1;i<3;i++){
     
            for(int j=0;j<g[i].size();j++)
                cout<<g[i][j]<<" ";
            cout<<endl;
        }
        for(int j=0;j<g[0].size();j++)
                cout<<g[0][j]<<" ";
            cout<<endl;
	//}
	return 0;
}

E . 击中目标

思路

代码

F . 序列计数

思路

代码

G . 强迫症

思路:map统计出现次数最多的即可。

代码

map<ll,ll>vis;


int main(){
     
    io;
    ll n; cin>>n; ll ans=0,res=0;
    for(int i=1;i<=n;i++){
     
        ll x; cin>>x;
        vis[x]++;
        if(vis[x]>res) res=vis[x],ans=x;
    }
    cout<<ans<<endl;
    return 0;
}

H . 新型冠状爱情病毒

思路

代码

I . 期末表彰

思路:期末考试题,结构体存各科分数+总分,然后按总分排序。

代码

struct node{
     
    ll id;
    ll b,c,d;
    ll s;
}a[manx];
bool cmp(node a,node b){
     
    if(a.s==b.s){
     
        if(a.b==b.b) return a.id<b.id;
        return a.b>b.b;
    }
    return a.s>b.s;
}

int main(){
     
	ll n;  io;  cin>>n;
	for(int i=1;i<=n;i++){
     
        a[i].id=i;
        cin>>a[i].b>>a[i].c>>a[i].d;
        a[i].s=a[i].b+a[i].c+a[i].d;
	}
	sort(a+1,a+1+n,cmp);
	for(int i=1;i<=5;i++){
     
        cout<<a[i].id<<" "<<a[i].b<<" "<<a[i].c<<" "<<a[i].d<<endl;
	}
	return 0;
}

J . 最小特征

思路:旋转90° 其实只是把相隔1位的元素互换位置,重复三次即可。

代码

char c[10];
ll ans,ans1,ans2,ans3;
ll lg[10];

ll pd(){
     
    ll x=0;
    for(int k=1;k<=8;k++){
     
        x+= ( (c[9]-'0')^(c[k]-'0') )*lg[8-k];
    }
    return x;
}

int main(){
     
    ll n; cin>>n;
    lg[0]=1;
    for(int i=1;i<=10;i++) lg[i]=lg[i-1]*2;
    while(n--){
     
        ans=ans1=ans2=ans3=0;
        cin>>c[1]>>c[2]>>c[3]>>c[8]>>c[9]>>c[4]>>c[7]>>c[6]>>c[5];
        ans=pd();
        char x=c[1];
        swap(c[3],c[5]); swap(c[3],c[7]); swap(c[1],c[3]);
        swap(c[2],c[4]); swap(c[2],c[6]); swap(c[2],c[8]);
        ans1=pd();
        swap(c[3],c[5]); swap(c[3],c[7]); swap(c[1],c[3]);
        swap(c[2],c[4]); swap(c[2],c[6]); swap(c[2],c[8]);
        ans2=pd();
        swap(c[3],c[5]); swap(c[3],c[7]); swap(c[1],c[3]);
        swap(c[2],c[4]); swap(c[2],c[6]); swap(c[2],c[8]);
        ans3=pd();
        ans=min(ans,ans1); ans=min(ans,ans2); ans=min(ans,ans3);
        cout<<ans<<endl;
    }
    return 0;
}

ends: 代码头

#include
#define mp make_pair
#define pb push_back
#define ll long long
#define fi first
#define se second
#define inf 0x3f3f3f3f
#define io std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
inline ll read(){
     ll s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){
     if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();return s*w;}
void put1(){
      puts("Yes") ;}void put2(){
      puts("No") ;}void put3(){
      puts("-1"); }
ll qp(ll a,ll b, ll p){
     ll ans = 1;while(b){
     if(b&1){
     ans = (ans*a)%p;--b;}a =
(a*a)%p;b >>= 1;}return ans%p;}
const int mo=998244353; const int mod=1000000007;

const int manx=1e6+5;
int main(){
     

    return 0;
}

你可能感兴趣的:(acm,远光杯,粤澳计算机程序设计,北京师范珠海校区,算法)