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;
}