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. 从浅入深详解独立ip网站域名恶意解析的解决方案

    立IP空间的好处想必大家都能耳熟闻详,稳定性强,利于seo等让大家选择了鼎峰网络香港独立IP空间.那么, 网站独享服务器IP地址,独立IP空间利于百度收录和权重的积累.不受牵连.稳定性强等诸多优势为一 ...

  2. mtd-utils 安装

    title: mkdosfs 安装 tags: linux date: 2018/12/26/ 17:08:54 --- mtd-utils安装 for 主机 在制作根文件系统中需要使用它制作jffs ...

  3. Pandas系列(五)-分类数据处理

    内容目录 1. 创建对象 2. 常用操作 3. 内存使用量的陷阱 一.创建对象 1.基本概念:分类数据直白来说就是取值为有限的,或者说是固定数量的可能值.例如:性别.血型. 2.创建分类数据:这里以血 ...

  4. Quartz C#使用

    参考:https://www.cnblogs.com/lazyInsects/p/8075487.htmlQuartz是一款比较好用的定时任务执行工具类,虽然我们平时也可以自己写代码实现定时执行,但是 ...

  5. ceph简单用户管理

    列出所有用户 ceph auth list 获取指定用户 ceph auth get client.admin 新增用户并输出密钥环 ceph auth get-or-create client.ge ...

  6. Windows密钥容器和证书的关系

    其实CSP主要是对容器里的密钥对操作的,和证书关系不大. 容器里的密钥对有两种类型:一种是AT_KEYEXCHANGE,表示加密的密钥对,一种是AT_SIGNATURE表示签名的密钥对. 由于美国的出 ...

  7. 帆软报表(finereport)单元格中各颜色标识的含义

    帆软报表(finereport)单元格中,可根据单元格角标的颜色判断单元格进行的操作 过滤:单元格左下角黄色三角形 条件属性:单元格左上角红色三角形.  控件:单元格右侧中间的各种矩形.  左父格:单 ...

  8. maven历史版本下载地址

    http://archive.apache.org/dist/maven/maven-3/

  9. HTTP/1.1 请求方法

      HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于分布式.协作式和超媒体信息系统的 应用层协议.HTTP 是万维网的数据通信的基础.默认端口为 80.   ...

  10. numpy数据去重

    import numpy as npx = np.array([1,2,3,2,4,2,5,7,7])print(np.unique(x)) 简单散点图的绘制,没有显示出文字是因为需要下载个插件