ICPC North America Qualifier Contest 2015 按通过率从 J开始

J. Torn To Pieces

思路很简单,主要是怎么实现:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 100+7;
/*
int head[M],cnt;
void init(){cnt=0,memset(head,-1,sizeof(head));}
struct EDGE{int to,nxt,val;}ee[M*2];
void add(int x,int y){ee[++cnt].nxt=head[x],ee[cnt].to=y,head[x]=cnt;}
*/
vector<int>G[M];
map<string,map<string,int> >mp;
map<string,int>id;
map<int,string>di;
vector<int>p;
string st,ed;
int vs[M];
bool f;
void dfs(int u,int fa)
{
	vs[u]=1;
	if(u==id[ed])
	{
		if(p.size()==0)return ;
		for(int i=0;i<p.size();i++)
		cout<<di[p[i]]<<" ";
		cout<<endl;
		f=true;
		return ;
	}
	for(auto v:G[u])
	{
		if(v==fa||vs[v])continue;
		p.pb(v);
		dfs(v,u);
		p.pop_back();
	}
}
char S[1100];
int main()
{
  	int n,sz=0;
  //	freopen("test_15.in","r",stdin);
  	cin>>n;
  	getchar();
  	for(int i=1;i<=n;i++)
  	{
  		int nm=1;
  		cin.getline(S,1000);
  		int l=strlen(S);
  		string s[40];
  		for(int j=0;j<l;j++)
  		{
  			if(S[j]==' ')
  			{
  				if(id.find(s[nm])==id.end())id[s[nm]]=++sz;
  				di[id[s[nm]]]=s[nm];
  				++nm; 
			}
  			else 
  				s[nm]+=S[j];
		}
		if(id.find(s[nm])==id.end())id[s[nm]]=++sz;
		di[id[s[nm]]]=s[nm];
		for(int j=2;j<=nm;j++)
  		{
  			int u=id[s[j]];
  			int v=id[s[1]];
  			G[u].pb(v);
  			G[v].pb(u);
		}
	}
  	cin>>st>>ed;
  	p.pb(id[st]);
	if(id[st])dfs(id[st],-1);
	if(!f)
		cout<<"no route found"<<endl;
	return 0;
}

 

A. All about that base

模拟+暴力就完事了 注意特判

#include <cstdio>
#include<cstring>
using namespace std;
typedef unsigned long long ll;
const int M = 110+7;
char s[M];
char pr[40]={"0123456789abcdefghijklmnopqrstuvwxyz0"};
ll a[3][40];
int gt(char ch)
{
	if(ch<='9'&&ch>='0')return ch-'0';
	return ch-'a'+10;
}
int main()
{
	int t;
	scanf("%d",&t);
	ll up=1;for(int i=1;i<=32;i++)up*=2;up--;
	while(t--)
	{
		scanf(" %[^\n]",s);
		int l=strlen(s);
		int tp=0;char op;
		memset(a,0,sizeof(a));
		for(int i=0;i<l;i++)
		{
			if(s[i]==' ')
			{
				if(tp==0)op=s[i+1];
				tp++;i+=2;
				continue;
			}
			for(int j=1;j<=36;j++)
			{
				if(a[tp][j]==-1)continue;
				a[tp][j]*=j;
				ll z=gt(s[i]);
				a[tp][j]+=z;
				if(a[tp][j]>up||z>j||z==j&&j!=1||z==0&&j==1)a[tp][j]=-1;
			}
		}
		int nm=0;
		for(int i=1;i<=36;i++)
		{
			bool f=true;
			for(int j=0;j<=2;j++)
			{
				if(a[j][i]==-1)
				f=false;
			}
		//	printf("%d  %lld %lld %lld\n",i,a[0][i],a[1][i],a[2][i]);
			if(!f)continue;
			ll w;
			if(op=='+'&&a[0][i]+a[1][i]==a[2][i]);
			else if(op=='-'&&a[0][i]-a[1][i]==a[2][i]);
			else if(op=='*'&&a[0][i]*a[1][i]==a[2][i]);
			else if(op=='/'&&a[2][i]*a[1][i]==a[0][i]);
			else f=false;
			if(f)printf("%c",pr[i]),nm++;
		}
		if(nm==0)printf("invalid");
		puts("");
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值