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;
}
剩下的两题有待更新。。