FYN OI奋斗之路5~

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日

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值