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