2009 ACM-ICPC NEERC

http://codeforces.com/gym/101308

过了5题:B,C,D,H,I

B题:

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

int main()
{
	freopen("business.in","r",stdin);
	freopen("business.out","w",stdout);
	int n,m,now,ans=2e9,x,y,i;
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		now=(x+y)-(y*n)%(x+y);
		if(now<ans)ans=now;
	}
	printf("%d\n",ans);
	return 0;
}

C题:是一道交互题,很有趣的一题

详细题解

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define real real1
int n;
int d[205];
int p[205];
vector<int> v[205];
struct st
{
	int id;
	int data;
};
int real[205];

void f(int& a,int& b,int& c)
{
	if (a>b) swap(a,b);
	if (a>c) swap(a,c);
	if (b>c) swap(b,c);
}

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

void init()
{
	st xx[205];
	for (int i=1;i<=n;i++)
	{
		xx[i].id=i;
		xx[i].data=rand();
	}
	sort(xx+1,xx+n+1,cmp);
	for (int i=1;i<=n;i++)
	{
		real[i]=xx[i].id;
	}
}

int read(int x,int y,int z)
{
	x=real[x];
	y=real[y];
	z=real[z];
	f(x,y,z);
	return y;
}

int main()
{
	srand(time(0));
	cin>>n;
	//init();
	if (n==3)
	{
		cout<<"OK 1 2 3"<<endl;
		return 0;
	}
	if (n==4)
	{
		int p[10];
		cout<<"2 3 4"<<endl;
		cin>>p[1];
		cout<<"1 3 4"<<endl;
		cin>>p[2];
		cout<<"1 2 4"<<endl;
		cin>>p[3];
		cout<<"1 2 3"<<endl;
		cin>>p[4];
		int x1=0,x2=0;
		for (int i=1;i<=4;i++)
		{
			if (p[i]==3)
			{
				if (x1==0) {d[i]=1;x1++;}
				else d[i]=2;
			}
			else
			{
				if (x2==0) {d[i]=3;x2++;}
				else d[i]=4;
			}
		}
		cout<<"OK";
		for (int i=1;i<=4;i++)
		{
			cout<<' '<<d[i];
		}
		cout<<endl;
		return 0;
	}
	memset(p,-1,sizeof(p));
	int cnt=0;
	int ans=0;
	for (int i=1;i<=min(n*(n-1)*(n-2)/12,1000);i++)
	{
		if (n-ans<=10) break;
		cnt++;
		while (1)
		{
			int a,b,c;
			a=rand()%n+1;
			b=rand()%n+1;
			c=rand()%n+1;
			f(a,b,c);
			if (a!=b && b!=c && d[a]==0 && d[b]==0 && d[c]==0)
			{
				cout<<a<<' '<<b<<' '<<c<<endl;
				int x;
				cin>>x;
				//x=read(a,b,c);
				if (v[x].empty())
				{
					v[x].push_back(a);
					v[x].push_back(b);
					v[x].push_back(c);
				}
				else
				{
					vector<int> vv;
					for (auto i:v[x])
					{
						if (i==a || i==b || i==c) vv.push_back(i);
					}
					v[x]=vv;
					if (v[x].size()==1)
					{
						if (p[x]==-1) ans++;
						d[v[x][0]]=x;
						p[x]=v[x][0];
					}
				}
				break;
			}
		}
	}
	vector<int> vv;
	for (int i=1;i<=n;i++)
	{
		if (d[i]==0) vv.push_back(i);
	}
	for (int i=0;i<vv.size();i++)
	{
		for (int j=i+1;j<vv.size();j++)
		{
			for (int k=j+1;k<vv.size();k++)
			{
				cnt++;
				cout<<vv[i]<<' '<<vv[j]<<' '<<vv[k]<<endl;
				int x;
				cin>>x;
				//x=read(vv[i],vv[j],vv[k]);
				if (v[x].empty())
				{
					v[x].push_back(vv[i]);
					v[x].push_back(vv[j]);
					v[x].push_back(vv[k]);
				}
				else
				{
					vector<int> vvv;
					for (auto a:v[x])
					{
						if (a==vv[i] || a==vv[j] || a==vv[k]) vvv.push_back(a);
					}
					v[x]=vvv;
					if (v[x].size()==1)
					{
						if (p[x]==-1) ans++;
						d[v[x][0]]=x;
						p[x]=v[x][0];
					}
				}
			}
		}
	}
	//cout<<ans<<endl;
	vv.clear();
	for (int i=1;i<=n;i++)
	{
		if (d[i]==0) vv.push_back(i);
	}
	int r[10];
	cout<<vv[1]<<' '<<vv[2]<<' '<<vv[3]<<endl;
	cin>>r[0];
	cout<<vv[0]<<' '<<vv[2]<<' '<<vv[3]<<endl;
	cin>>r[1];
	cout<<vv[0]<<' '<<vv[1]<<' '<<vv[3]<<endl;
	cin>>r[2];
	cout<<vv[0]<<' '<<vv[1]<<' '<<vv[2]<<endl;
	cin>>r[3];
//	r[0]=read(vv[1],vv[2],vv[3]);
//	r[1]=read(vv[0],vv[2],vv[3]);
//	r[2]=read(vv[0],vv[1],vv[3]);
//	r[3]=read(vv[1],vv[2],vv[0]);
	int p1=0,p2=0;
	for (int i=0;i<=3;i++)
	{
		if (r[i]!=2)
		{
			if (p1==0)
			{
				d[vv[i]]=1;
				p1++;
			}
			else d[vv[i]]=2;
		}
		else
		{
			if (p2==0)
			{
				d[vv[i]]=n-1;
				p2++;
			}
			else d[vv[i]]=n;
		}
	}
	cout<<"OK";
	for (int i=1;i<=n;i++)
	{
		cout<<' '<<d[i];
	}
	cout<<endl;
	return 0;
}

D题:直接字符串哈希,然后暴力O(n^2*m)即可,cf的评测机性能果然很好啊

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=1000000000000007LL;
const int mod2=1000000007;
string s;
int a[10005][15];
int n,m;

void print(int x,int y)
{
	printf("NO\n");
	printf("%d %d\n",x,y);
	int cnt=0;
	for (int i=1;i<=m;i++)
	{
		if (a[x][i]==a[y][i])
		{
			if (cnt==0)
			{
				printf("%d ",i);
				cnt++;
			}
			else if (cnt==1)
			{
				printf("%d\n",i);
				return;
			}
		}
	}
}

int main()
{
	freopen("database.in","r",stdin);
	freopen("database.out","w",stdout);
	scanf("%d%d",&n,&m);
	getline(cin,s);
	for (int i=1;i<=n;i++)
	{
		getline(cin,s);
		ll x=0;
		int cnt=0;
		for (int j=0;j<s.size();j++)
		{
			if (s[j]==',')
			{
				a[i][++cnt]=(int)(x%mod2);
				x=0;
			}
			else
			{
				x=(x*257+s[j])%mod;
			}
		}
		a[i][++cnt]=x;
	}
	for (int i=1;i<=n;i++)
	{
		for (int j=i+1;j<=n;j++)
		{
			int x=0;
			for (int k=1;k<=m;k++)
			{
				if (a[i][k]==a[j][k]) x++;
			}
			if (x>=2)
			{
				print(i,j);
				return 0;
			}
		}
	}
	printf("YES\n");
	return 0;
}

H题:水题,直接模拟

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

int main()
{
	freopen("headshot.in","r",stdin);
	freopen("headshot.out","w",stdout);
	cin>>s;
	int n=s.length();
	int p1=0,q1,p2=0,q2;
	q1=n;
	for (int i=0;i<n;i++)
	{
		if (s[i]=='0') p1++;
	}
	q2=p1;
	for (int i=0;i<n;i++)
	{
		if (s[i]=='0')
		{
			if (s[(i+1)%n]=='0') p2++;
		}
	}
	if (p1*q2==p2*q1) printf("EQUAL\n");
	else if (p1*q2>p2*q1) printf("ROTATE\n");
	else printf("SHOOT");
	return 0;
}

I题:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=105;
const int inf=2e9;
int up[N][N],low[N][N],flow[N][N];
int pv[N],que[N],d[N];
int n; 
void maxflow(int n,int src,int sink)
{
	int p,q,t,i,j;
	do
	{
		for(i=0;i<n;pv[i++]=0);
		pv[t=src]=src+1;d[t]=inf;
		for(p=q=0;p<=q && !pv[sink];t=que[p++])
			for(i=0;i<n;i++)
			{
				if(!pv[i] && up[t][i] && (j=up[t][i]-flow[t][i])>0)
					pv[que[q++]=i]=+t+1,d[i]=d[t]<j?d[t]:j;
				else if (!pv[i] && up[i][t] && (j=flow[i][t])>0)
				pv[que[q++]=i]=-t-1,d[i]=d[t]<j?d[t]:j;
			}
			for(i=sink;pv[i] && i!=src;)
			{
				if(pv[i]>0)flow[pv[i]-1][i]+=d[sink],i=pv[i]-1;
				else flow[i][-pv[i]-1]-=d[sink],i=-pv[i]-1;
			}
	}while(pv[sink]);
}
int limitflow(int n,int src,int sink)
{
	int i,j,sk,ks;
	if(src==sink)return inf;
	up[n][n+1]=up[n+1][n]=up[n][n]=up[n+1][n+1]=0;
	for(i=0;i<n;i++)
	{
		up[n][i]=up[i][n]=up[n+1][i]=up[i][n+1]=0;
		for(j=0;j<n;j++)
		{
			up[i][j]-=low[i][j];
			up[n][i]+=low[j][i];
			up[i][n+1]+=low[i][j];
		}
	}
	sk=up[src][sink];ks=up[sink][src];
	up[src][sink]=up[sink][src]=inf;
	maxflow(n+2,n,n+1);
	for(i=0;i<n;i++)
		if(flow[n][i]<up[n][i])return -1;
	flow[src][sink]=flow[sink][src]=0;
	up[src][sink]=ks;up[sink][src]=sk;
	maxflow(n,sink,src);
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
		{
			up[i][j]+=low[i][j];
			flow[i][j]+=low[i][j];
		}
		for(j=i=0;i<n;j+=flow[src][i++]);
		return j;
}
void searchpath(int now)
{
	int i,x,y;
	for(i=0;i<=n;i++)
	{
		if(i==n)i++;
		if(flow[now][i]!=0)
		{
			if(i==n+1)printf("\n");
			else printf("%d ",i+1);
			searchpath(i);
			flow[now][i]--;
			break;
		}
	} 
}
int main()
{
	freopen("inspection.in","r",stdin);
	freopen("inspection.out","w",stdout);
	int i,j,x,y;
	memset(low,0,sizeof(low));
	memset(up,0,sizeof(up));
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&x);
		for(j=0;j<x;j++)
		{
			scanf("%d",&y);
			low[i][y-1]=1;
			up[i][y-1]=inf;
		}
	}
	for(i=0;i<n;i++)
	{
		low[n][i]=0;
		up[n][i]=inf;
	}
	for(i=0;i<n;i++)
	{
		low[i][n+1]=0;
		up[i][n+1]=inf;
	}
	int flownum=limitflow(n+2,n,n+1);
	/*for(i=0;i<=n+1;i++)
	{
		for(j=0;j<=n+1;j++)
		printf("%d ",flow[i][j]);
		printf("\n");
	}*/
	printf("%d\n",flownum);
	for(i=1;i<=flownum;i++)
		searchpath(n);
	return 0;
}

猜你喜欢

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