2018 ACM 网络选拔赛 北京赛区
P.S:正统方法:n*m*6(at most five oxygens),bfs O(6nm)
类似题目 https://www.cnblogs.com/cmyg/p/11108069.html
#include <bits/stdc++.h>
using namespace std;
const int maxn=; struct node
{
int x,y,z,t;
}; struct cmp
{
bool operator() (node a,node b)
{
return a.t>b.t;
}
}; priority_queue<node,vector<node>,cmp>st; int dx[]={-,,,};
int dy[]={,-,,}; int f[maxn][maxn][];
char s[maxn][maxn]; int main()
{
int n,m,x,y,z,t,xx,yy,zz,tt,i,j,k,r;
while (~scanf("%d%d",&n,&m))
{
if (n==)
break;
while (!st.empty())
st.pop(); for (i=;i<=n;i++)
scanf("%s",s[i]+);
for (i=;i<=n;i++)
for (j=;j<=m;j++)
if (s[i][j]=='S')
{
x=i;
y=j;
break;
}
for (i=;i<=n;i++)
for (j=;j<=m;j++)
for (k=;k<=;k++)
f[i][j][k]=1e9;
f[x][y][]=;
st.push({x,y,,}); r=-;
while (!st.empty())
{
x=st.top().x;
y=st.top().y;
z=st.top().z;
t=st.top().t;
st.pop(); if (r!=- && r<=t)
break; for (i=;i<;i++)
{
xx=x+dx[i];
yy=y+dy[i];
zz=min(z+(s[xx][yy]=='B')-(s[xx][yy]=='#'),);
tt=t+-(s[xx][yy]=='P')+(s[xx][yy]=='#');
if (zz>= && xx>= && xx<=n && yy>= && yy<=m && f[xx][yy][zz]>tt)
{
if (s[xx][yy]=='T')
{
if (r==-)
r=tt;
else
r=min(r,tt);
} f[xx][yy][zz]=tt;
st.push({xx,yy,zz,tt});
}
}
} printf("%d\n",r);
}
return ;
}
队友的方法是某每一个点按氧气量分成6个点,并连接旁边的点和设置对应的值,跑一遍spfa
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <time.h>
#include <string>
#include <set>
#include <map>
#include <list>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <ext/rope>
#include <algorithm>
#include <iostream>
using namespace std;
#define ll long long
#define minv 1e-6
#define inf 1e9
#define pi 3.1415926536
#define nl 2.7182818284
const ll mod=1e9+;//
const int maxn=1e6+; struct node
{
char str[];
int _index;
}f[maxn]; int k,g,_index;
char str[],s[];
bool v[]; void dfs(int pos,int l)
{
int i;
for (i=pos;i<=k;i++)
if (i==k)
{
s[l]=;
g++;
strcpy(f[g].str,s);
f[g]._index=_index;
}
else
{
s[l]=str[i];
dfs(i+,l+);
}
} int cmp(node a,node b)
{
return strcmp(a.str,b.str)<;
} int main()
{
int n,i,j,len,x,y;
while (~scanf("%d",&n))
{
g=;
for (_index=;_index<=n;_index++)
{
scanf("%s",str);
len=strlen(str);
strcpy(s,str);
strcat(str,s);
for (i=;i<len;i++)
{
s[]=str[i];
j=;
k=i+len;
dfs(i+,j);
}
}
sort(f+,f+g+,cmp); x=;
strcpy(f[g+].str,"");
for (i=;i<=g;i++)
{
v[f[i]._index]=; if (strcmp(f[i].str,f[i+].str)!=)
{
for (_index=;_index<=n;_index++)
if (!v[_index])
break;
if (_index==n+)
{
len=strlen(f[i].str);
if (len>x)
{
x=len;
y=i;
}
} for (_index=;_index<=n;_index++)
v[_index]=;
}
}
if (x==)
printf("0\n");
else
printf("%s\n",f[y].str);
}
return ;
}
/*
2
ab
ba
*/
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+; int f[][],_index,card;
int value[]={,,,,,,,,,,,,,};
int cur,rep_card,rep_value;
int hap[];
int c,cc[];
int claim; void replace_card()
{
int i;
c++;
cc[c]=f[_index][rep_card]; for (i=rep_card;i<f[_index][];i++)
f[_index][i]=f[_index][i+];
f[_index][]--;
} int find_num(int j)
{
int g=,i;
for (i=;i<=f[j][];i++)
if (f[j][i]==card)
g++;
return g;
} bool judge1()
{
int i;
for (i=;i<=f[_index][];i++)
if (f[_index][i]==card)
{
rep_card=i;
return ;
}
return ;
} bool judge2()
{
int g=find_num(_index);
if (g== || g==)
return ;
else
return ;
} void get_rep_value()
{
int i;
rep_value=;
for (i=;i<=f[_index][];i++)
if (value[f[_index][i]]<rep_value)
{
rep_value=value[f[_index][i]];
rep_card=i;
}
} void handle_value()
{
int i;
claim=;
for (i=;i<=f[_index][];)
if (value[f[_index][i]]==rep_value)
{
claim++;
rep_card=i;
replace_card();
}
else
i++;
} void handle_card()
{
int i;
claim=;
for (i=;i<=f[_index][];)
if (f[_index][i]==card)
{
claim++;
rep_card=i;
replace_card();
}
else
i++;
} ///one:value
void work1()
{
get_rep_value();
if (rep_value!=)
replace_card();
} ///many:value
void work2()
{
get_rep_value();
handle_value();
} ///one:card
void work3()
{
replace_card();
} ///many:card
void work4()
{
handle_card();
} ///work2
void work5()
{
int g=,i;
memset(hap,,sizeof(hap));
for (i=;i<=f[_index][];i++)
hap[f[_index][i]]++;
rep_value=;
for (i=;i<=;i++)
if (hap[i]!= && (hap[i]<g || (hap[i]==g && value[i]<rep_value)))
{
g=hap[i];
rep_value=value[i];
}
handle_value();
} void show()
{
bool vis;
if (_index==)
{
vis=judge1();
if (vis)
{
work3();
cur=;
}
else
{
work1();
cur=;
}
claim=;
}
else if (_index==)
{
vis=judge1();
if (vis)
{
work4();
cur=;
}
else
{
work1();
cur=;
claim=;
}
}
else if (_index==)
{
vis=judge1();
if (vis)
{
work4();
cur=;
}
else
{
work5();
cur=;
}
}
else
{
vis=judge2();
if (vis)
{
work4();
cur=;
}
else
{
work4();
work1();
if (rep_value!=)
{
claim++;
cur=;
}
else
cur=;
}
}
} bool next_lie(int j)
{
int next__index,next_card,i;
next__index=(_index+)%;
if (next__index!=j)
return ;
next_card=card+;
if (next_card==)
next_card=;
for (i=;i<=f[next__index][];i++)
if (f[next__index][i]==next_card)
return ;
return ;
} bool zhiyi(int j)
{
if (j==)
{
if (next_lie(j) || claim+find_num(j)>)
return ;
else
return ;
}
else if (j==)
{
if (next_lie(j))
return ;
else
return ;
}
else if (j==)
{
if (find_num(j)==)
return ;
else
return ;
}
else
{
if (f[_index][]==)
return ;
else
return ;
}
} void add_card(int j)
{
int i;
for (i=;i<=c;i++)
f[j][++f[j][]]=cc[i];
} void pr(int v)
{
if (v==)
printf("A");
else if (v==)
printf("");
else if (v==)
printf("J");
else if (v==)
printf("Q");
else if (v==)
printf("K");
else
printf("%d",v);
} int main()
{
int i,j;
char ch[];
while (~scanf("%s",ch))
{
for (i=;i<;i++)
{
for (j=;j<=;j++)
{
if (!(i== && j==))
scanf("%s",ch);
if (ch[]=='')
f[i][j]=;
else if (ch[]=='J')
f[i][j]=;
else if (ch[]=='Q')
f[i][j]=;
else if (ch[]=='K')
f[i][j]=;
else if (ch[]=='A')
f[i][j]=;
else
f[i][j]=ch[]-;
}
f[i][]=;
}
_index=;
card=;
c=; while ()
{
// for (i=0;i<4;i++)
// {
// for (j=1;j<=f[i][0];j++)
// {
// pr(f[i][j]);
// if (j==f[i][0])
// printf("\n");
// else
// printf(" ");
// }
// }
// printf("remain: ");
// for (i=1;i<=c;i++)
// {
// pr(cc[i]);
// if (i==c)
// printf("\n");
// else
// printf(" ");
// }
// printf("\n\n");
// printf("index=%d card=%d\n",_index,card); show(); for (i=(_index+)%;i!=_index;i=(i+)%)
if (zhiyi(i))
{
if (cur)
add_card(i);
else
add_card(_index);
c=;
break;
} if (f[_index][]==)
break; _index=(_index+)%;
if (card==)
card=;
else
card++;
} for (i=;i<;i++)
if (f[i][]==)
printf("WINNER\n");
else
{
sort(f[i]+,f[i]+f[i][]+);
for (j=;j<=f[i][];j++)
{
pr(f[i][j]);
if (j==f[i][])
printf("\n");
else
printf(" ");
}
}
}
return ;
}
/*
A A 2 2 3 3 4 4 5 5 6 6 7
7 8 8 9 9 10 10 J J Q Q K K
A A 2 2 3 3 4 4 5 5 6 6 7
7 8 8 9 9 10 10 J J Q Q K K A A A A 2 2 2 2 3 3 3 3 K
4 4 4 4 5 5 5 5 6 6 6 6 K
7 7 7 7 8 8 8 8 9 9 9 9 K
10 10 10 10 J J J J Q Q Q Q K 4 4 4 4 5 5 5 5 6 6 6 6 K
7 7 7 7 8 8 8 8 9 9 9 9 K
10 10 10 10 J J J J Q Q Q Q K
A A A A 2 2 2 2 3 3 3 3 K A A 2 2 8 8 9 9 5 5 6 6 7
3 3 4 4 7 10 10 J J Q Q K K
A A 2 2 3 3 4 4 5 Q Q K K
5 6 6 7 7 8 8 9 9 10 10 J J */
比赛后的改进方法:统计每位选手中每张牌的数目
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define minv 1e-6
#define inf 1e9
#define pi 3.1415926536
#define nl 2.7182818284
const ll mod=1e9+;//
const int maxn=1e5+; int value[]={,,,,,,,,,,,,,};
int card[][],x,y,v,table[],nexty;
bool vis; void work1()
{
vis=;
v=;
table[y]++;
card[x][y]--;
} void work2()
{
int i;
vis=;
for (i=;i<=;i++)
if (card[x][value[i]])
break;
v=;
table[value[i]]++;
card[x][value[i]]--;
} void work3()
{
vis=;
v=card[x][y];
table[y]+=card[x][y];
card[x][y]=;
} void work4()
{
int p=,q,i;
vis=;
for (i=;i<=;i++)
if (card[x][value[i]]!= && card[x][value[i]]<p)
p=card[x][value[i]],q=value[i];
v=card[x][q];
table[q]+=card[x][q];
card[x][q]=;
} void work5()
{
int i;
for (i=;i<=;i++)
if (card[x][value[i]])
break;
if (i!=)
{
vis=;
v++;
table[value[i]]++;
card[x][value[i]]--;
}
} void fapai()
{
if (x==)
{
if (card[x][y])
work1();
else
work2();
}
else if (x==)
{
if (card[x][y])
work3();
else
work2();
}
else if (x==)
{
if (card[x][y])
work3();
else
work4();
}
else if (x==)
{
if (card[x][y]>=)
work3();
else
{
work3();
work5();
}
}
} bool faempty()
{
int i;
for (i=;i<=;i++)
if (card[x][i]!=)
return ;
return ;
} bool zhiyi(int index)
{
if (index==)
{
if (index==(x+)% && card[index][nexty]==)
return ;
if (v+card[index][y]>)
return ;
return ;
}
else if (index==)
{
if (index==(x+)% && card[index][nexty]==)
return ;
return ;
}
else if (index==)
{
if (card[index][y]==)
return ;
return ;
}
else
return faempty();
} void add(int index)
{
int i;
for (i=;i<=;i++)
{
card[index][i]+=table[i];
table[i]=;
}
} void print()
{
int i,j,k;
for (i=;i<;i++)
{
vis=;
for (j=;j<=;j++)
for (k=;k<=card[i][j];k++)
{
if (vis)
printf(" ");
else
vis=;
if (j==)
printf("A");
else if (j==)
printf("");
else if (j==)
printf("J");
else if (j==)
printf("Q");
else if (j==)
printf("K");
else
printf("%c",j+);
}
if (!vis)
printf("WINNER");
printf("\n");
}
} int main()
{
int i,j,index;
char ch[];
while (~scanf("%s",ch))
{
memset(card,,sizeof(card));
memset(table,,sizeof(table));
for (i=;i<;i++)
{
for (j=;j<=;j++)
{
if (i!= || j!=)
scanf("%s",ch);
if (ch[]=='A')
card[i][]++;
else if (ch[]=='')
card[i][]++;
else if (ch[]=='J')
card[i][]++;
else if (ch[]=='Q')
card[i][]++;
else if (ch[]=='K')
card[i][]++;
else
card[i][ch[]-]++;
}
}
x=;
y=;
nexty=;
while ()
{
fapai();
for (index=(x+)%;index!=x;index=(index+)%)
if (zhiyi(index))
{
if (vis)
add(index);
else
add(x);
}
if (faempty())
break;
// printf("\nx=%d y=%d\n",x,y);
// print();
x=(x+)%;
y=nexty;
if (nexty==)
nexty=;
else
nexty++;
}
print();
}
return ;
}
莫名其妙单调队列代码没有做对,
思路:
对于i+1~i+n要满足任意前缀和大于等于0,
需满足 any x in [i+1,i+n] sum(x)-sum(i)>=0,
也就是求 min(sum(x))。
当然线段树求区间最小值,但就是太麻烦了。(网络有大佬是这样做的)
单调队列:
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cstring>
#include <string>
#include <map>
#include <set>
#include <list>
#include <queue>
#include <stack>
#include <bitset>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
#define ll long long
const int maxn=1e6+; ll a[maxn<<],tot[maxn<<];
int q[maxn<<]; int main()
{
int t,i,n,m,head,tail;
ll c,b;
scanf("%d",&t);
while (t--)
{
scanf("%d%lld",&n,&c);
for (i=;i<=n;i++)
scanf("%lld",&a[i]);
for (i=;i<=n;i++)
{
scanf("%lld",&b);
a[i]-=b;
}
for (i=n+;i<*n;i++)
a[i]=a[i-n];
m=n<<;
head=;
tail=;
tot[]=;
for (i=;i<m;i++)
{
tot[i]=tot[i-]+a[i];
while (head<=tail && q[head]<=i-n)
head++;
while (tail>=head && tot[i]<tot[q[tail]])
tail--;
tail++;
q[tail]=i;
if (i>=n && tot[q[head]]-tot[i-n]>=-c)
break;
}
if (i==m)
i=-;
else
i-=n-;
printf("%d\n",i);
}
return ;
}
/*
100
3 0
3 4 5
5 4 3 3 100
-3 -4 -5
30 40 50 3 1
1 5 4
2 3 1 5 3
1 2 3 4 100
2 4 5 10 5 5 0
1 2 3 4 5
2 3 2 5 3 1 1
3
4 5 0
5 1 2 4 3
3 2 4 5 1
*/
当莫名奇妙很多人做对时,考虑一下贪心(找规律),或者就是数据范围开小了
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e6; ll a[maxn<<],c;
int n; bool judge(int j)
{
int i,k=j+n;
ll m=c;
for (i=j;i<k;i++)
{
m+=a[i];
if (m<)
return ;
}
return ;
} int main()
{
int t,i;
ll b;
scanf("%d",&t);
while (t--)
{
scanf("%d%lld",&n,&c);
for (i=;i<=n;i++)
scanf("%lld",&a[i]);
for (i=;i<=n;i++)
{
scanf("%lld",&b);
a[i]-=b;
}
for (i=n+;i<*n;i++)
a[i]=a[i-n];
for (i=;i<=n;i++)
if (judge(i))
break;
if (i==n+)
i=-;
printf("%d\n",i);
}
return ;
}
大佬的非常短的代码也看不懂(https://www.cnblogs.com/caomingpei/p/9691253.html)
写过的错误代码
https://paste.ubuntu.com/p/DkqyfqFXd6/
2018 ACM 网络选拔赛 北京赛区的更多相关文章
- 2018 ACM 网络选拔赛 青岛赛区
一些题目的代码被网站吞了…… Problem B. Red Black Tree http://acm.zju.edu.cn/onlinejudge/searchProblem.do?contestI ...
- 2018 ACM 网络选拔赛 徐州赛区
A. Hard to prepare #include <cstdio> #include <cstdlib> #include <cmath> #include ...
- 2018 ACM 网络选拔赛 焦作赛区
A. Magic Mirror #include <cstdio> #include <cstdlib> #include <cmath> #include < ...
- 2018 ACM 网络选拔赛 沈阳赛区
B. Call of Accepted #include <cstdio> #include <cstdlib> #include <cmath> #include ...
- 2018 ACM 网络选拔赛 南京赛区
A. An Olympian Math Problem #include <cstdio> #include <cstdlib> #include <cmath> ...
- HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛)
HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛) Panda Time Limit: 10000/4000 MS (Java/Others) Memory Limit: ...
- ACM总结——2017ACM-ICPC北京赛区现场赛总结
现在距离比赛结束已经过了一个多星期了,也是终于有时间写下心得了.回来就是被压着做项目,也是够够的. 这次比赛一样是我和两个学弟(虽然是学弟,但我的实力才是最弱的T_T)一起参加的,成绩的话打铁,算是情 ...
- 2016ACM-ICPC网络赛北京赛区 1001 (trie树牌大模拟)
[题目传送门] 1383 : The Book List 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 The history of Peking University ...
- HDU 4041 Eliminate Witches! (模拟题 ACM ICPC 2011亚洲北京赛区网络赛)
HDU 4041 Eliminate Witches! (模拟题 ACM ICPC 2011 亚洲北京赛区网络赛题目) Eliminate Witches! Time Limit: 2000/1000 ...
随机推荐
- Redis常用操作-------Hash(哈希表)
1.HDEL key field [field ...] 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略. 在Redis2.4以下的版本里, HDEL 每次只能删除单个域,如果你需要在一 ...
- [BUAA软工]第一次结对作业
[BUAA软工]结对作业 本次作业所属课程: 2019BUAA软件工程 本次作业要求: 结对项目 我在本课程的目标: 熟悉结对合作,为团队合作打下基础 本次作业的帮助:理解一个c++ 项目的开发历程 ...
- first time to use github
first time to use github and feeling good. 学习软件工程,老师要求我们用这个软件管理自己的代码,网站是全英的,软件也简单易用,方便 https://githu ...
- 【转】XSHELL下直接下载文件到本地(Windows)
XSHELL下直接下载文件到本地(Windows) http://www.cnblogs.com/davytitan/p/3966606.html
- Activiti启动某个流程失败,页面报500
现象:Activiti启动某个流程失败,页面报500,错误日志如下. 2017-06-19 10:50:09 [org.activiti.engine.impl.interceptor.Command ...
- React 模板
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- 关于python requests 包跑ssl的设置 和 charles相关抓包的问题
由于在测试服务器上测试东西都是https,然后最近又在和大神一起开发openapi,api写好当然是要测试的 python上测试接口最好用的莫过于requests模块了.但是 我还从来没有用reque ...
- 照片 GPS 信息查询
照片 GPS 信息查询 经纬度查询 https://jingweidu.51240.com/ // 30.27832833333333, 120.01914111111111 30 + 16/60 + ...
- javaIO缓冲区
java中IO类分类. 图来自网络 缓冲区:应用程序在内存中开辟的一个空间.用来放置需要被写入或写出的数据. 使用缓冲区的 优点:使得应用程序操作磁盘(或者说是与磁盘的通信)的次数降低,提高应用程序的 ...
- Ubuntu 16.04 root环境变量不生效问题解决方案
在Ubuntu 16.04中配置JDK环境变量,但是在切换到root时不生效 . 在/etc/profile中添加如下: export JAVA_HOME=/opt/java/jdk1..0_151 ...