2008 ACM-ICPC NEERC

http://codeforces.com/gym/100286

这场比赛就过了5题:B,G,H,I,J,发挥的也不是很好,感觉自己越来越菜了

B题,一道交互题,很水,直接dfs就可以了

#include <bits/stdc++.h>
using namespace std;
#define ll long long
string way[4]={"NORTH","WEST","SOUTH","EAST"};
int a[80][80];
string state;

void dfs(int x,int y)
{
	if (a[x][y+1]==-1)
	{
		cout<<way[0]<<endl;
		cin>>state;
		if (state=="EMPTY")
		{
			a[x][y+1]=1;
			dfs(x,y+1);
			cout<<way[2]<<endl;
			cin>>state;
		}
		else a[x][y+1]=0;
	}
	if (a[x-1][y]==-1)
	{
		cout<<way[1]<<endl;
		cin>>state;
		if (state=="EMPTY")
		{
			a[x-1][y]=1;
			dfs(x-1,y);
			cout<<way[3]<<endl;
			cin>>state;
		}
		else a[x-1][y]=0;
	}
	if (a[x][y-1]==-1)
	{
		cout<<way[2]<<endl;
		cin>>state;
		if (state=="EMPTY")
		{
			a[x][y-1]=1;
			dfs(x,y-1);
			cout<<way[0]<<endl;
			cin>>state;
		}
		else a[x][y-1]=0;
	}
	if (a[x+1][y]==-1)
	{
		cout<<way[3]<<endl;
		cin>>state;
		if (state=="EMPTY")
		{
			a[x+1][y]=1;
			dfs(x+1,y);
			cout<<way[1]<<endl;
			cin>>state;
		}
		else a[x+1][y]=0;
	}
}

int main()
{
	memset(a,-1,sizeof(a));
	a[30][30]=1;
	dfs(30,30);
	cout<<"DONE"<<endl;	
	return 0;
}


G题,按照通过率来看也是一道水题,队友直接过了,我也没看

#include <bits/stdc++.h>
using namespace std;
#define ll long long
long long ans = 1e14+7;
int main()
{
	freopen("giant.in","r",stdin);
	freopen("giant.out","w",stdout);
	int n;
	long long rh,rv,sh,sv,a,b,c,d,e,aa,bb,cc,dd;
	scanf("%lld%lld%lld%lld",&rh,&rv,&sh,&sv);
	scanf("%d",&n);
	for(int i = 0; i < n; i++)
	{
		scanf("%lld%lld%lld%lld%lld",&a,&b,&c,&d,&e);
		ll a1 = 1ll*e*max(rh/a+(rh%a!=0),sh/c+(sh%c!=0))*max(rv/b+(rv%b!=0),sv/d+(sv%d!=0));
		ans = min(a1,ans);
		a1 = 1ll*e*max(rv/a+(rv%a!=0),sv/c+(sv%c!=0))*max(rh/b+(rh%b!=0),sh/d+(sh%d!=0));
		ans = min(a1,ans);
	}
	printf("%lld",ans);
}
/*
1024 1024 300 300
3 
1024 768 295 270 200
1280 1024 365 301 250
1280 800 350 270 210

2400 2000 800 700
3
1024 768 295 270 200
1280 1024 365 301 250
1280 800 350 270 210

*/


H题,题意是给你一个数组,元素个数小于1e5,ai<i,问能否找到一个数组b,b中每个元素都是1或者-1,使得∑ai*bi=0,问题就是每个数可以取或者不取,问和能否等于sum/2,因为保证了ai<i,所以直接从后往前贪心即可,一定能得到答案。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n;
int ans[100005];
struct st
{
	int id;
	int num;
}a[100005];

bool cmp(st a,st b)
{
	return a.num<b.num;
}

int main()
{
	freopen("hell.in","r",stdin);
	freopen("hell.out","w",stdout);
	while (~scanf("%d",&n))
	{
		for (int i=1;i<=n;i++)
		{
			a[i].id=i;
			scanf("%d",&a[i].num);
		}
		sort(a+1,a+n+1,cmp);
		ll sum=0;
		for (int i=1;i<=n;i++)
		{
			sum+=a[i].num;
		}
		if (sum%2!=0)
		{
			printf("No\n");
			continue;
		}
		sum/=2;
		for (int i=n;i>=1;i--)
		{
			if (sum>=a[i].num)
			{
				ans[a[i].id]=1;
				sum-=a[i].num;
			}
			else ans[a[i].id]=-1;
		}
		if (sum==0)
		{
			printf("Yes\n");
			for (int i=1;i<=n;i++)
			{
				printf("%d",ans[i]);
				if (i!=n) printf(" ");
			}
			printf("\n");
		}
		else printf("No\n");
	}
	return 0;
}


I题水题,直接提取符号然后倒置一下即可

#include <bits/stdc++.h>
using namespace std;
#define ll long long
string s;

int main()
{
	freopen("isharp.in","r",stdin);
	freopen("isharp.out","w",stdout);
	getline(cin,s);
	stringstream ss(s);
	string name;
	ss>>name;
	while (ss>>s)
	{
		cout<<name;
		for (int i=s.size()-1;i>=0;i--)
		{
			if (s[i]=='*') cout<<"*";
			if (s[i]=='&') cout<<"&";
			if (s[i]=='[') cout<<"[]";
		}
		string x="";
		for (int i=0;i<s.size();i++)
		{
			if ((s[i]>='a' && s[i]<='z') || (s[i]>='A' && s[i]<='Z')) x+=s[i];
			else break;
		}
		cout<<" "<<x<<";"<<endl;
	}
	return 0;
}


J题暴力,26个字母选取5个字母作为元音,然后O(n^2)判断,判到错误立即退出

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define f(x,y) for (int (x)=(y)+1;(x)<26;(x)++)
#define ff(x) for (int (x)=0;(x)<26;(x)++)
#define map map1
vector<string> v;
string s;
int a[30][30];
char map[30];
char ss[30]="BCDFGHJKLMNPQRSTVWXYZ"; 

void print()
{
	for (auto x:v)
	{
		for (auto xx:x)
		{
			printf("%c",map[xx-'A']);
		}
		printf(" ");
	}
}

int main()
{
	freopen("javanese.in","r",stdin);
	freopen("javanese.out","w",stdout);
	while (cin>>s)
	{
		for (int i=0;i<(int)s.size()-1;i++)
		{
			a[s[i]-'A'][s[i+1]-'A']=1;
			a[s[i+1]-'A'][s[i]-'A']=1;
		}
		v.push_back(s);
	} 
	ff(x1)
		f(x2,x1)
			f(x3,x2)
			{
				if (a[x1][x2]==1 || a[x1][x3]==1 || a[x2][x3]==1) continue;
				f(x4,x3)
					f(x5,x4)
					{
						int can=1;
						ff(i)
						{
							ff(j)
							{
								int x=0;
								if ((i==x1 || i==x2 || i==x3 || i==x4 || i==x5)==(j==x1 || j==x2 || j==x3 || j==x4 || j==x5))
								{
									if (a[i][j]==1)
									{
										can=0;
										break;
									}
								}
							}
							if (can==0) break;
						}
						if (can==0) continue;
						map[x1]='A';
						map[x2]='E';
						map[x3]='I';
						map[x4]='O';
						map[x5]='U';
						int cnt=0;
						ff(i)
						{
							if (i!=x1 && i!=x2 && i!=x3 && i!=x4 && i!=x5)
							{
								map[i]=ss[cnt++];
							}
						}
						print();
						return 0;		
					}
					
			}
	cout<<"impossible"<<endl;			
	return 0;
}

猜你喜欢

转载自blog.csdn.net/njupt_lyy/article/details/81009109