codeforces # 285 解题报告A.B.C

A - Contest

水题。

根据要求分别算出两人的分数比较就行。

代码如下:

#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <set>
#include <stdio.h>
using namespace std;
#define LL __int64
#define pi acos(-1.0)
const int mod=100000000;
const int INF=0x3f3f3f3f;
const double eqs=1e-8;

int main()
{
    int a, b, c, d, ans1, ans2;
    scanf("%d%d%d%d",&a,&b,&c,&d);
    ans1=max(3*a/10,a-a/250*c);
    ans2=max(3*b/10,b-b/250*d);
    //printf("%d %d\n",ans1,ans2);
    if(ans1>ans2) puts("Misha");
    else if(ans1<ans2) puts("Vasya");
    else puts("Tie");
    return 0;
}

B -  Misha and Changing Handles

每输入一个就向前查找,然后符合条件的替换。

代码如下:

#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <set>
#include <stdio.h>
using namespace std;
#define LL __int64
#define pi acos(-1.0)
const int mod=100000000;
const int INF=0x3f3f3f3f;
const double eqs=1e-8;
map<string,int>q;
struct node
{
    char s1[30], s2[30];
}fei[2000];
int main()
{
    int n, i, j, cnt=0, flag;
    char st1[30], st2[30];
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%s%s",st1,st2);
        flag=0;
        for(j=0;j<cnt;j++){
            if(!strcmp(st1,fei[j].s2)){
                strcpy(fei[j].s2,st2);
                flag=1;
                break;
            }
        }
        if(!flag){
            strcpy(fei[cnt].s1,st1);
            strcpy(fei[cnt++].s2,st2);
        }
    }
    printf("%d\n",cnt);
    for(i=0;i<cnt;i++){
        printf("%s %s\n",fei[i].s1,fei[i].s2);
    }
    return 0;
}

C -  Misha and Forest

从叶子节点开始,不断删除并向上找就行。因为叶子节点的异或和就是它的另一个父节点。

代码如下:

#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <set>
#include <stdio.h>
using namespace std;
#define LL __int64
#define pi acos(-1.0)
const int mod=100000000;
const int INF=0x3f3f3f3f;
const double eqs=1e-8;
struct node
{
    int d, x;
}fei[1<<17];
struct N
{
    int u, v;
}edge[1<<17];
queue<int>q;
int main()
{
    int n, i, j, d, x, cnt=0, u, v;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d%d",&fei[i].d,&fei[i].x);
    }
    for(i=0;i<n;i++){
        if(fei[i].d==1){
            q.push(i);
            //break;
        }
    }
    while(!q.empty()){
        u=q.front();
        q.pop();
        if(fei[u].d!=1) continue ;
        edge[cnt].u=u;
        v=fei[u].x;
        edge[cnt++].v=v;
        fei[v].d--;
        fei[v].x^=u;
        if(fei[v].d==1){
            q.push(v);
        }
    }
    printf("%d\n",cnt);
    for(i=0;i<cnt;i++){
        printf("%d %d\n",edge[i].u,edge[i].v);
    }
    return 0;
}

剩下的两题有待更新。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值