FYN OI奋斗之路5~

来源:互联网 发布:mac图片文件夹在哪里 编辑:程序博客网 时间:2024/06/04 19:36

  • XJOI奋斗群群赛7解题报告本周总结
    • 原题
    • A - Bachgold Problem
      • 题意
      • 题解
    • B - Parallelogram is Back
      • 题意
      • 题解
    • C - Voting
      • 题意
      • 题解
    • D - Secrets
      • 题意
      • 题解
    • E - Chips
      • 题意
      • 题解
    • 本周总结

XJOI奋斗群群赛7解题报告+本周总结

原题

https://cn.vjudge.net/contest/184260

A - Bachgold Problem

题意

输入一个数n,求出最多能将其分解为多少质数和,并输出这些质数。

题解

水题,偶数分解为n/2个2,奇数分解为3和(n-3)/2个2即可。

#include<bits/stdc++.h>using namespace std;int main(){    int n,count=0;    cin>>n;    if(n%2==0){        cout<<n/2<<endl;        for(int i=1;i<=n/2;i++){            cout<<2<<" ";        }    }    else{        cout<<n/2<<endl;        for(int i=1;i<n/2;i++){            cout<<2<<" ";        }        cout<<3;    }}

B - Parallelogram is Back

题意

输入平行四边形的3个点,输出第四个点可能的位置。

题解

水题,第四个点显然有三个位置,注意除2时用double即可。

#include<bits/stdc++.h>using namespace std;int main(){    double x[100],y[100],c[100],d[100];    for(int i=1;i<=3;i++){        cin>>x[i]>>y[i];    }    c[1]=(x[1]+x[2])/2.0;    c[2]=(x[1]+x[3])/2.0;    c[3]=(x[2]+x[3])/2.0;    d[1]=(y[1]+y[2])/2.0;    d[2]=(y[1]+y[3])/2.0;    d[3]=(y[2]+y[3])/2.0;    cout<<3<<endl;    cout<<c[1]-(x[3]-c[1])<<" "<<d[1]-(y[3]-d[1])<<endl;    cout<<c[2]-(x[2]-c[2])<<" "<<d[2]-(y[2]-d[2])<<endl;    cout<<c[3]-(x[1]-c[3])<<" "<<d[3]-(y[1]-d[3])<<endl;}

C - Voting

题意

n个人进行投票,分为两个党派,轮到某个有投票权人时,他可以否决另一个党派的人的投票权,按此循环直至剩下最后一个人,他的党派即胜利的党派。

题解

建两个队列,分别存储党派为D,R的人的编号,之后模拟否决的操作即可。

#include<bits/stdc++.h>using namespace std;char c[200010];int num[200010];int main() {    int n;    cin>>n;    memset(num,0,sizeof(num));    queue <int> d;    queue <int> r;    cin>>c;    for(int i=0; i<n; i++) {        if(c[i]=='D') d.push(i);        else r.push(i);    }    while(!d.empty()&&!r.empty()) {        for(int i=0; i<n; i++) {            if(num[i]) {                continue;            }            if(c[i]=='D') {                int temp1;                temp1=d.front();                d.pop();                int temp2;                temp2=r.front();                r.pop();                num[temp2]=1;                d.push(temp1);            } else {                int temp1;                temp1=r.front();                r.pop();                int temp2;                temp2=d.front();                d.pop();                num[temp2]=1;                r.push(temp1);            }            if(d.empty()||r.empty()) {                break;            }        }    }    if(!d.empty()) {        cout<<"D";        return 0;    } else {        cout<<"R";        return 0;    }}

D - Secrets

题意

大意是一个国家,它的货币面值只有3的幂,给出一个n值,假设n无法由目前所有的硬币组合成,那么求在多花最少钱的情况下最多用多少枚硬币。

题解

n不断除3,若无法整除3,则等于n/3+1。

#include<bits/stdc++.h>using namespace std;int main(){    long long int n,t,ans;    cin>>n;    if(n%3!=0){        ans=n/3+1;    }    else if(n%3==0){        t=3*3;        while(t){            if(t==n){                ans=1;                break;            }            if(n%t!=0){                ans=n/t+1;                break;            }            else{                t=t*3;            }        }    }    cout<<ans;    return 0;}

E - Chips

题意

一个n*n的矩阵的边框上(不包括四个角落)放棋子,有m个不能过的点,要求每个棋子走到对面,棋子不能相撞,求最多棋子数。

题解

一个不能过的点可以废掉它所在一行和一列,其他行列不会影响。

#include<bits/stdc++.h>using namespace std;const int MAXN=10000;int a[MAXN]={0},b[MAXN]={0};int main(){    int n,m;    cin>>n>>m;    int ans1=n-2,ans2=n-2;    int x,y;    for(int i=1;i<=m;i++){        cin>>x>>y;        a[x]=1;        b[y]=1;    }    for(int i=2;i<=n-1;i++){        if(a[i]==1) ans1--;        if(b[i]==1) ans2--;    }    int ans=ans1+ans2;    if(n%2==1&&a[(n+1)/2]==0&&b[(n+1)/2]==0) {        ans--;    }    cout<<ans;}

本周总结

这周比赛的题目基本上AB是水题,后面的题目就比较难了,有比较多是要用到数据结构的,然而这块掌握的并不是特别好,其他的不足点还是有些粗心吧,包括数据范围和输出内容上还是时有错误,另外有些分类讨论的思维题也会考虑不全。还有就是心态问题,一题做不出来比较容易被卡住。下周,划水的AB题就要离我们而去了2333。
最后贴出czl和吴老师常说的话:学信息的人永不服输!

2017年9月10日

原创粉丝点击