A. Alien Sunset

暴力枚举答案即可。

#include<cstdio>
int n,i,mx;
struct P{
int h,r,t;
bool night(int x){
x%=h;
if(r<=t)return x<=r||x>=t;
return x<=r&&x>=t;
}
}a[50];
inline bool check(int x){
for(int i=0;i<n;i++)if(!a[i].night(x))return 0;
return 1;
}
int main(){
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d%d%d",&a[i].h,&a[i].r,&a[i].t);
if(a[i].h>mx)mx=a[i].h;
}
for(i=0;i<1825*mx;i++)if(check(i))return printf("%d",i),0;
puts("impossible");
}

  

B. Breaking Biscuits

等价于选择一对距离最小的平行线夹住所有点。

枚举一条边,计算两侧所有点到这条直线的距离的最大值即可。

时间复杂度$O(n^3)$。

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=111;
struct P{
int x,y;
P(){}
P(int _x,int _y){x=_x,y=_y;}
P operator-(P b){return P(x-b.x,y-b.y);}
double len(){return hypot(x,y);}
}a[N];
int n,i,j,k;
double cross(P a,P b){return a.x*b.y-a.y*b.x;}
double dist(P p,P a,P b){
return cross(p-a,b-a)/(b-a).len();
}
int main(){
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y);
double ans=1e100;
a[n+1]=a[1];
for(i=1;i<=n;i++)for(j=1;j<i;j++){
double l=1e100,r=-1e100;
for(k=1;k<=n;k++){
l=min(l,dist(a[k],a[i],a[j]));
r=max(r,dist(a[k],a[i],a[j]));
}
r-=l;
ans=min(ans,r);
}
printf("%.10f",ans);
}

  

C. Cued In

按题意模拟即可。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
const int N = 3e5 + 10;
const int inf = 1e9;
int casenum, casei;
int c[2010], e[15];
int n;
map<string, int> mop;
int num[10];
char s[20];
int main()
{
mop["red"] = 1; mop["yellow"] = 2; mop["green"] = 3; mop["brown"] = 4;
mop["blue"] = 5; mop["pink"] = 6; mop["black"] = 7;
while(~scanf("%d", &n)){
for(int i = 1; i <= n; i ++){
scanf("%s", s);
num[mop[s]] ++;
}
int top = 1;
for(int i = 2; i <= 7; i ++){
if(num[i]) top = i;
}
if(top == 1) puts("1");
else{
int ans = 0;
ans = (1 + top) * num[1];
for(int i = 2; i <= 7; i ++) ans += num[i] * i;
printf("%d\n", ans);
} }
return 0;
}
/* */

  

D. Deranging Hat

求出最终位置,然后贪心置换即可。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
const int N = 1e5 + 10;
char s[N];
struct A
{
char ch;
int now;
bool operator < (const A & b)const
{
if(ch != b.ch)return ch < b.ch;
return now < b.now;
}
}a[N];
int pos_to_o[N];
int main()
{
while(~scanf("%s", s))
{
int n = strlen(s);
for(int i = 0; i < n; ++i)
{
a[i].ch = s[i];
a[i].now = i;
}
sort(a, a + n);
for(int i = 0; i < n; ++i)
{
pos_to_o[a[i].now] = i;
}
vector<pair<int, int> >ans;
for(int i = 0; i < n; ++i)
{
//我们要考虑移动,把位置为a[i].now的数,移动到位置i,那位置i的数的位置变成了a[i].now
if(a[i].now != i)
{
ans.push_back(make_pair(i, a[i].now));
int p = a[i].now;
int o = pos_to_o[i];
a[o].now = a[i].now;
pos_to_o[p] = o;
}
}
int g = ans.size() - 1;
for(int i = g; i >= 0; --i)
{
printf("%d %d\n", ans[i].second + 1, ans[i].first + 1);
}
}
return 0;
}
/* */

  

E. Education

按人数从大到小考虑,每次选择满足条件的最便宜的房子。

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=5010;
int n,m,i,a[N],b[N],c[N],q[N],ans[N];
bool cmp(int x,int y){return a[x]<a[y];}
int ask(int x){
int t=0,f=~0U>>1;
for(int i=1;i<=m;i++)if(b[i]>=x){
if(c[i]<f)f=c[i],t=i;
}
return t;
}
int main(){
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)scanf("%d",&a[i]),q[i]=i;
for(i=1;i<=m;i++)scanf("%d",&b[i]);
for(i=1;i<=m;i++)scanf("%d",&c[i]);
sort(q+1,q+n+1,cmp);
for(i=n;i;i--){
int x=ask(a[q[i]]);
if(!x)return puts("impossible"),0;
b[x]=0;
ans[q[i]]=x;
}
for(i=1;i<=n;i++)printf("%d ",ans[i]);
}

  

F. Flipping Coins

$f[i][j]$表示还需要操作$i$次,目前有$j$枚硬币朝上时的最大期望正面向上的硬币数。

时间复杂度$O(nk)$。

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=444;
double f[N][N],ans;
int n,m,i,j;
int main(){
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)f[0][i]=i;
for(i=1;i<=m;i++)for(j=0;j<=n;j++){
if(j)f[i][j]=(f[i-1][j]+f[i-1][j-1])/2;
if(j<n)f[i][j]=max(f[i][j],(f[i-1][j]+f[i-1][j+1])/2);
}
printf("%.10f",f[m][0]);
}

  

G. GentleBots

设估价函数为两点到终点的曼哈顿距离之和,每次选取使得估价函数最优的方向走,若不能走,则随机抖动。

#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int dx[7]={1,-1,0,0,0,0,0},
dy[7]={0,0,-1,1,0,0,0},
dz[7]={0,0,0,0,1,-1,0};
struct P{
int x,y,z;
void read(){
scanf("%d%d%d",&x,&y,&z);
}
int dis(P b){
return abs(x-b.x)+abs(y-b.y)+abs(z-b.z);
}
void write(){
printf("(%d %d %d)",x,y,z);
}
P(){}
P(int _x,int _y,int _z){x=_x,y=_y,z=_z;}
P apply(int d){
return P(x+dx[d],y+dy[d],z+dz[d]);
}
}A,B,C,D;//A->B C->D
int main(){
A.read();
B.read();
C.read();
D.read();
while(1){
A.write();
putchar(' ');
C.write();
puts("");
int pre=A.dis(B)+C.dis(D);
if(!pre)return 0;
int best=~0U>>1;
int I=0,J=0;
for(int i=0;i<7;i++)for(int j=0;j<7;j++){
P NA=A.apply(i),NC=C.apply(j);
if(!NA.dis(C))continue;
if(!NA.dis(NC))continue;
if(!NC.dis(A))continue;
if(!NC.dis(NA))continue;
int now=NA.dis(B)+NC.dis(D);
if(now<best)best=now,I=i,J=j;
}
if(best>=pre){
while(1){
int i=rand()%7,j=rand()%7;
P NA=A.apply(i),NC=C.apply(j);
if(!NA.dis(C))continue;
if(!NA.dis(NC))continue;
if(!NC.dis(A))continue;
if(!NC.dis(NA))continue;
I=i,J=j;
break;
}
}
A=A.apply(I);
C=C.apply(J);
}
}

  

H. Hiker Safety

能走就走,用队列维护所有可能走的人,时间复杂度$O(n^2)$。

#include<cstdio>
const int N=10010;
int B,m,i,n,d[N],a[N],pos[N],r;
int h,t,x,q[10000000];
int cnt,fin[3333333];
inline int abs(int x){return x>0?x:-x;}
inline bool check(int x){
if(pos[x]==m)return 0;
int pre=x-1,nxt=x+1;
if(nxt>r)nxt=0;
if(pre){
if(abs(d[pos[x]+1]-d[pos[pre]])>B)return 0;
if(abs(d[pos[x]+1]-d[pos[pre]])<a[x])return 0;
if(abs(d[pos[x]+1]-d[pos[pre]])<a[pre])return 0;
}
if(nxt){
if(abs(d[pos[x]+1]-d[pos[nxt]])>B)return 0;
if(abs(d[pos[x]+1]-d[pos[nxt]])<a[x])return 0;
if(abs(d[pos[x]+1]-d[pos[nxt]])<a[nxt])return 0;
}
return 1;
}
inline void gao(int x){
//printf("->%d\n",x);
pos[x]++;
fin[++cnt]=x;
while(r&&pos[r]==m)r--;
if(x>1)q[++t]=x-1;
if(x<r)q[++t]=x+1;
if(x<=r)q[++t]=x;
}
int main(){
scanf("%d%d",&B,&m);
for(i=1;i<=m;i++)scanf("%d",&d[i]);
for(i=1;i<m;i++)if(d[i]>d[i+1])while(1);
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d%d",&a[i],&pos[i]);
}
for(i=1;i<=n;i++){
if(pos[i]<m)r=i;
}
//[1,r]
h=1,t=0;
for(i=1;i<=r;i++)q[++t]=i;
while(h<=t){
x=q[h++];
if(check(x)){
gao(x);
}
}
for(i=1;i<=n;i++)if(pos[i]<m)return puts("impossible"),0;
for(i=1;i<=cnt;i++)printf("%d ",fin[i]);
}

  

I. I Work All Day

按题意模拟即可。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
const int N = 3e5 + 10;
const int inf = 1e9;
int casenum, casei;
int c[15], e[15];
int n;
int main()
{
while(~scanf("%d", &n))
{
for(int i = 0; i < n; ++i)scanf("%d", &c[i]);
int T; scanf("%d", &T);
int ans = c[0]; int val = T % c[0];
for(int i = 1; i < n; ++i)
{
if(T % c[i] < val)
{
val = T % c[i];
ans = c[i];
}
}
printf("%d\n", ans);
}
return 0;
}
/* */

  

J. Just A Minim

按题意模拟即可。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
const int N = 3e5 + 10;
const int inf = 1e9;
int casenum, casei;
int c[2010], e[15];
int n;
int main()
{
while(~scanf("%d", &n))
{
for(int i = 0; i < n; ++i)scanf("%d", &c[i]);
double ans = 0;
for(int i = 0; i < n; i ++){
if(c[i] == 0) ans += 2;
else if(c[i] == 1) ans += 1;
else if(c[i] == 2) ans += 0.5;
else if(c[i] == 4) ans += 0.25;
else if(c[i] == 8) ans += 0.125;
else if(c[i] == 16) ans += 0.0625;
}
printf("%.8f\n", ans);
}
return 0;
}
/* */

  

K. Knightsbridge Rises

拆点求最大流。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
const int N = 305, M = N * N * 8;
const int inf = 0x3f3f3f3f;
#define MS(x, y) memset(x, y, sizeof(x))
int n;
int L[N], W[N];
int ST, ED;
int first[N], ID;
int w[M], cap[M], nxt[M];
void ins(int x, int y, int cap_)
{
w[++ID] = y;
cap[ID] = cap_;
nxt[ID] = first[x];
first[x] = ID; w[++ID] = x;
cap[ID] = 0;
nxt[ID] = first[y];
first[y] = ID;
}
int d[N];
bool bfs()
{
MS(d, -1);
queue<int>q; q.push(ST); d[ST] = 0;
while(!q.empty())
{
int x = q.front(); q.pop();
for(int z = first[x]; z; z = nxt[z])if(cap[z])
{
int y = w[z];
if(d[y] == -1)
{
d[y] = d[x] + 1;
q.push(y);
if(y == ED)return 1;
}
}
}
return 0;
}
int dfs(int x, int all)
{
if(x == ED)return all;
int use = 0;
for(int z = first[x]; z; z = nxt[z])if(cap[z])
{
int y = w[z];
if(d[y] == d[x] + 1)
{
int tmp = dfs(y, min(cap[z], all - use));
cap[z] -= tmp;
cap[z ^ 1] += tmp;
use += tmp;
if(use == all)break;
}
}
if(use == 0)d[x] = -1;
return use;
}
int dinic()
{
int ret = 0;
while(bfs())ret += dfs(ST, inf);
return ret;
}
vector<int>vt[N];
void go(int o, int x)
{
for(int z = first[x]; z; z = nxt[z])if((z & 1) && cap[z])
{
x = w[z];
break;
}
if(x == 0)
{
//for(auto it : vt[o])
/*
int cnt = 0;
for(int ii = 0; ii < vt[o].size(); ++ii)
{
int it = vt[o][ii];
if(++cnt == 1)printf("%d", it);
else printf(" %d", it);
}
puts("");
*/
return;
}
vt[o].push_back(x - n);
go(o, x - n);
}
int main()
{
while(~scanf("%d", &n))
{
MS(first, 0); ID = 1;
ST = 0;
for(int i = 1; i <= n; ++i)
{
scanf("%d%d", &W[i], &L[i]);
if(W[i] == 0)
{
ins(ST, i, 1);
}
ins(i, n + i, 1);
}
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= n; ++j)if(j != i && L[i] >= W[j])
{
ins(n + i, j, 1);
}
}
int m;
scanf("%d", &m);
ED = n + n + m + 1;
for(int i = 1; i <= m; ++i)
{
int x;
scanf("%d", &x);
ins(n + n + i, ED, 1);
for(int j = 1; j <= n; ++j)if(L[j] >= x)
{
ins(n + j, n + n + i, 1);
}
}
if(dinic() != m)
{
puts("impossible");
}
else
{
for(int z = first[ED]; z; z = nxt[z])if((z & 1) && cap[z])
{
vt[w[z] - n - n].clear();
go(w[z] - n - n, w[z]);
}
for(int o = 1; o <= m; ++o)
{
int cnt = 0;
for(int ii = vt[o].size() - 1; ii >= 0; --ii)
{
int it = vt[o][ii];
if(++cnt == 1)printf("%d", it);
else printf(" %d", it);
}
puts("");
}
}
}
return 0;
}
/*
5
0 1
1 2
2 3
3 4
0 2
2
4 2 7
0 1
1 4
0 3
0 1
2 5
2 5
1 2
3
5 4 5 2
0 1
5 3
2
2 1 */

  

L. Lounge Lizards

将所有点到原点的方向向量约分后分组,每组按距离从小到大排序,然后求LIS。

时间复杂度$O(n\log n)$。

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1000010;
int n,i,j,k,m,f[N],ans;
struct P{int x,y,h;ll w;}a[N],O;
ll sqr(ll x){return x*x;}
int gcd(int a,int b){return b?gcd(b,a%b):a;}
inline bool cmp(const P&a,const P&b){
if(a.x!=b.x)return a.x<b.x;
if(a.y!=b.y)return a.y<b.y;
return a.w<b.w;
}
inline void ins(int x){
if(!m||x>f[m]){
f[++m]=x;
return;
}
int l=1,r=m,mid,t;
while(l<=r){
mid=(l+r)>>1;
if(f[mid]>=x)r=(t=mid)-1;else l=mid+1;
}
f[t]=x;
}
int main(){
scanf("%d%d",&O.x,&O.y);
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].h);
a[i].x-=O.x;
a[i].y-=O.y;
a[i].w=sqr(a[i].x)+sqr(a[i].y);
//sgn gcd
int d=gcd(abs(a[i].x),abs(a[i].y));
a[i].x/=d,a[i].y/=d;
//printf("%d %d %lld\n",a[i].x,a[i].y,a[i].w);
}
sort(a+1,a+n+1,cmp);
for(i=1;i<=n;i=j){
for(j=i;j<=n&&a[i].x==a[j].x&&a[i].y==a[j].y;j++);
m=0;
for(k=i;k<j;k++){
ins(a[k].h);
}
ans+=m;
}
printf("%d",ans);
}
/*
0 0
6
0 -1 2
0 -2 2
0 -3 3
0 1 1
0 2 2
0 3 1
*/

  

2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017)的更多相关文章

  1. Codeforces Gym101606 A.Alien Sunset (2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017))

    2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017) 寒假第一次组队训练赛,和学长一起训练,题目难度是3颗星,我和猪队友写 ...

  2. [寒假集训第一场]gym101606 2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017)

    3星场 难度在于英文题面太难读懂了QAQ 看样例猜题意的我 博客园的c++主题真丑 A Alien Sunset \(description\) 有\(n\)个星球,每个星球自转时间不一样,所以一天的 ...

  3. Codeforces Gym101606 C.Cued In (2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017))

    C Cued In 这个题是打球的.都忘了写的什么了... 代码: 1 #include<iostream> 2 #include<cstring> 3 #include< ...

  4. Codeforces Gym101606 J.Just A Minim (2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017))

    J Just A Minim 超级无敌大水题,但是被精度卡了一手,输出要精确到小数点后6位,我直接输出的... 代码: 1 #include<iostream> 2 #include< ...

  5. Codeforces Gym101606 I.I Work All Day (2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017))

    I I Work All Day 这个题就是取模找最小的. 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include< ...

  6. Codeforces Gym101606 E.Education (2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017))

    E Education 这个题有点意思,就是找满足条件的最小价格里的最大值的人数,有点贪心的思想吧,一开始写错了,人群的那个不能排序,而且是最小价格里找能住下人最多的部门,让这个部门去住这个房间.在循 ...

  7. Codeforces Gym101606 D.Deranging Hat (2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017))

    D Deranging Hat 这个题简直了,本来想的是冒泡排序然后逆着输出来的,后来发现不对,因为题目上求的是最优解,而且冒泡的话,输出结果有的超出10000行了,所以就是把一开始的,排好序的字母标 ...

  8. 2019.04.11 第四次训练 【 2017 United Kingdom and Ireland Programming Contest】

    题目链接:  https://codeforces.com/gym/101606 A: ✅ B: C: ✅ D: ✅ https://blog.csdn.net/Cassie_zkq/article/ ...

  9. 2017 United Kingdom and Ireland Programming(Gym - 101606)

    题目很水.睡过了迟到了一个小时,到达战场一看,俩队友AC五个了.. 就只贴我补的几个吧. B - Breaking Biscuits Gym - 101606B 旋转卡壳模板题.然后敲错了. 代码是另 ...

随机推荐

  1. java调用matlab绘图

    一 注意事项 1: MatLab的版本必须是2006b+(包括2006b或更高版本),因为只有在这些版本中才有MATLAB Builder for Java(也叫Java Builder). 2: 运 ...

  2. Docker下安装Jenkins

    Docker安装参见:https://www.cnblogs.com/hackyo/p/9280042.html 安装Jenkins: docker run \ -u root \ --rm \ -d ...

  3. django - 总结 - cookie|session

    Cookie是通过HTTP请求和响应头在客户端和服务器端传递的. 在Web开发中,使用session来完成会话跟踪,session底层依赖Cookie技术. --------------------- ...

  4. JDBC Template

    JDBC Template 1. Spring JDBC Spring框架对JDBC的简单封装,提供了一个JDBCTemplate对象用来简化JDBC的开发 步骤: 导入jar包 创建JDBCTemp ...

  5. SpringBoot系列: 制作Docker镜像的全过程

    本文主要参考了 https://segmentfault.com/a/1190000016449865 , 感谢作者的付出. 另外,  在本文中, 演示了Windows+Maven+Docker To ...

  6. SpringBoot系列: 使用 Swagger 生成 API 文档

    SpringBoot非常适合开发 Restful API程序, 我们都知道为API文档非常重要, 但要维护好难度也很大, 原因有: 1. API文档如何能被方便地找到? 以文件的形式编写API文档都有 ...

  7. 应用留数定理计算实积分 $\dps{I(x)=\int_{-1}^1\frac{\rd t}{\sqrt{1-t^2}(t-x)}\ (|x|>1,x\in\bbR)}$ [华中师范大学2010年复变函数复试试题]

    应用留数定理计算实积分 $\dps{I(x)=\int_{-1}^1\frac{\rd t}{\sqrt{1-t^2}(t-x)}\ (|x|>1,x\in\bbR)}$ [华中师范大学2010 ...

  8. Groovy 设计模式 -- 保镖模式

    Bouncer Pattern http://groovy-lang.org/design-patterns.html#_bouncer_pattern 保镖模式主要负责对函数的输入参数的合法性检查, ...

  9. nginx禁止ip登录,只允许域名访问

    公司要求,线上solr.kibana要求只能通过域名进行访问,禁止用ip+端口进行登录访问,那么,下面介绍下我是如何实现的 1.禁止ip,允许域名访问 如下图,默认安装好nginx,不让ip方式访问, ...

  10. es6编程建议和技巧点汇总

    大括号 特点:大括号(单独的大括号或者if等后的大括号)内是一个单独的作用域 注意点:在块级作用域内声明的函数,类似var,会被提升到大括号外,应避免在块级作用域内声明函数.如果确实需要,写成函数表达 ...