20160730noip模拟赛zld

codeforces394E
如果没有在凸多边形内一点的限制,答案肯定是
如果不在凸多边形内,那么目标点肯定在凸多边形边上,我们枚举每条边,在每条边上求出距离平方和最小的点,在这些点中求出最小的
我们可以发现固定一点计算这个平方和不要O(m)的时间,只要维护x坐标平方和,x坐标的和就可以O(1)计算,但是计算起来很鬼畜
其实最后答案就是凸多边形上,离这个最近的点。
#include<map>
#include<stack>
#include<queue>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<complex>
#include<iostream>
#include<assert.h>
#include<algorithm>
using namespace std;
#define inf 1001001001
#define infll 1001001001001001001LL
#define FOR0(i,n) for(int (i)=0;(i)<(n);++(i))
#define FOR1(i,n) for(int (i)=1;(i)<=(n);++(i))
#define ll long long
#define dbg(vari) cerr<<#vari<<" = "<<(vari)<<endl
#define gmax(a,b) (a)=max((a),(b))
#define gmin(a,b) (a)=min((a),(b))
#define ios0 ios_base::sync_with_stdio(0)
#define Ri register int
#define gc getchar()
#define il inline
il int read(){
bool f=true;
Ri x=0;char ch;
while(!isdigit(ch=gc))if(ch=='-')f=false;
while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=gc;}
return f?x:-x;
}
#define gi read()
#define FO(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
int n,m;
#define eps 1e-6
struct point{
double x,y;
il void rd(){
x=gi;y=gi;
}
point operator+(point a) {return (point){x+a.x,y+a.y};}
point operator-(point a) {return (point){x-a.x,y-a.y};}
point operator*(double a){return (point){x*a,y*a};}
point operator/(double a){return (point){x/a,y/a};}
double operator^(point a){return x*a.y-y*a.x;}//叉积
double operator&(point a){return x*a.x+y*a.y;}//点积
}p[100001],q[100001];
//q m个点的 多边形
//p n个目标点
double A,B,C;
bool inside(point a,point b,point c){//chk if a between b-c
double A=a-b&c-b;
double B=c-b&c-b;
double C=a-b^c-b;
if (fabs(C)>eps) return 0;
if (A>-eps&&A<B+eps) return 1;
return 0;
}
int in_hull(point *b,point q) {
int cnt=0;
FOR1(i,m){
if(inside(q,b[i],b[i+1])) return 2;
if((b[i]-q^b[i+1]-q)>eps) cnt++;
}
if (cnt==m||!cnt) return 1;
return 0;
}
double dist(point a,point b){
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
int main(){
FO(point);
n=gi;
FOR1(i,n)p[i].rd();
m=gi;
FOR1(i,m)q[i].rd();q[0]=q[m];
double sx,sy,sx2,sy2;sx=sy=sx2=sy2=0;
FOR1(i,n)sx+=p[i].x,sy+=p[i].y,sx2+=p[i].x*p[i].x,sy2+=p[i].y*p[i].y ;
if(in_hull(q,(point){sx/n,sy/n})){
double ans=0.0;
FOR1(i,n)ans+=dist((point){sx/n,sy/n},p[i]);
printf("%.8lf",ans);
//做到这里发现不会算不在多边形内的
}else{
sx*=2.0;sy*=2.0;
double ans=infll;
for(int i=0;i<m;i++){
int s=i,t=i+1;
double dx=q[t].x-q[s].x,dy=q[t].y-q[s].y;
double a=q[s].x,b=q[s].y;
double A=dx*dx+dy*dy,B=2*a*dx+2*b*dy-sx/n*dx-sy/n*dy;
double k=(-B)/(2*A);
if(k<0) k=0;
if(k>1) k=1;
double x=a+dx*k,y=b+dy*k;
double ss=n*(x-sx/(2.0*n))*(x-sx/(2.0*n))+sx2-(sx*sx)/(4.0*n)+n*(y-sy/(2.0*n))*(y-sy/(2.0*n))+sy2-(sy*sy)/(4.0*n);
ans=min(ans,ss);
}
printf("%.8lf\n",ans);
}
//30/07/16 09:38如果WA了就是哪里nm pq反了
//30/07/16 09:52写完发现推的不对
//
return 0;
}


套用一位大佬的话,这是一道送命题
题目要求相当于是使每一行都与第一行相等或者完全相反
那么就大概有了思路
当n>k时。肯定有没被修改的行,我们枚举这个行在哪
当n<=k时,枚举第一列的状态,统计答案
#include<stack>
#include<queue>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<complex>
#include<iostream>
#include<assert.h>
#include<algorithm>
using namespace std;
#define inf 1001001001
#define infll 1001001001001001001LL
#define FOR0(i,n) for(int (i)=0;(i)<(n);++(i))
#define FOR1(i,n) for(int (i)=1;(i)<=(n);++(i))
#define ll long long
#define dbg(vari) cerr<<#vari<<" = "<<(vari)<<endl
#define gmax(a,b) (a)=max((a),(b))
#define gmin(a,b) (a)=min((a),(b))
#define ios0 ios_base::sync_with_stdio(0)
#define Ri register int
#define gc getchar()
#define il inline
il int read(){
bool f=true;
Ri x=0;char ch;
while(!isdigit(ch=gc))if(ch=='-')f=false;
while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=gc;}
return f?x:-x;
}
#define gi read()
#define FO(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
int n,m,k,map[101][101]; int main(){
FO(table);
int T=gi;
while(T--){
n=gi;m=gi;k=gi;
FOR1(i,n)FOR1(j,m)map[i][j]=gi;
if(n>k){
int res=inf,ans;
FOR1(i,n){
ans=0;
FOR1(j,n){
int cnt=0;
if(i!=j)
FOR1(k,m){
cnt+=map[i][k]^map[j][k];
}
ans+=min(cnt,m-cnt);
}
gmin(res,ans);
}
printf("%d\n",res>k?-1:res);
}else{
bool p[101];int ans=inf;
FOR0(st,1<<n){
FOR1(i,n)p[i]=st&(1<<(i-1));
// FOR1(i,n)cout<<p[i];puts("");
int res=0;
FOR1(i,n)res+=(p[i]^map[i][1]);
FOR1(i,m){
int cnt=0;
FOR1(j,n)cnt+=(p[j]^map[j][i]);
res+=min(cnt,n-cnt);
}
// cout<<res<<endl;
gmin(ans,res);
}
printf("%d\n",ans>k?-1:ans);
}
// puts("----------------------------");
}
return 0;
}
T3

还没做
20160730noip模拟赛zld的更多相关文章
- 20160727noip模拟赛zld
首先最优策略肯定是这样的:我们取出这个序列中的最大值,然后将整个序列分为左右两部分, 那么我们一定先把左右两部分合起来然后再与这个值合并 那么我们可以得出一个基于最值查询(rmq)的的算法,但是zld ...
- 20160729noip模拟赛zld
首先显然有多少个奇数,就有多少个回文串是最优的(没有奇数时构造一个回文串 然后有了k个“核心”,把剩下的字符顺序安排到这些的两侧,最后最短的回文串长度就是答案 #include<map> ...
- 20160728noip模拟赛zld
前言:单独对题面描述的评分-> [题解]把相邻长度为2的子串两两连边,跑欧拉路 /*明天再写,先贴一份方老师代码压压惊*/ #include<map> #include<sta ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- NOI模拟赛 Day1
[考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...
- NOIP第7场模拟赛题解
NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 小奇模拟赛9.13 by hzwer
2015年9月13日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿(explo) [题目背景] 小奇要开采一些矿物,它驾驶着一台带有钻头(初始能力值w)的飞船,按既定路线依次飞 ...
随机推荐
- xcode5下cocos2dx横竖屏设置
我们在开发一款游戏之前一定会考虑的一件事就是,我们的游戏是支持横屏还是竖屏,又或者是横竖屏都支持.那么如何在xcode中对项目进行设置呢?下面我就在xcode5.1.1中利用cocos2dx2.2.3 ...
- OC9_代理正向传值
// // ProtectedDeleagate.h // OC9_代理正向传值 // // Created by zhangxueming on 15/6/24. // Copyright (c) ...
- 使用单用户模式破解Linux密码
使用单用户模式破解Linux密码 特别说明:在实际工作应用中,安装Linux操作系统必须设置装载口令,否则很容易被破解. 1.使用reboot指令重启Linux操作系统 2.在进入操作系统数秒时,单击 ...
- java利用反射绕过私有检查机制实行对private、protected成员变量或方法的访问
在java中,如果类里面的变量是声明了private的,那么只能在被类中访问,外界不能调用,如果是protected类型的,只能在子类或本包中调用,俗话说没有不透风的墙.但是可以利用java中的反射从 ...
- Find the Difference
Given two strings s and t which consist of only lowercase letters. String t is generated by random s ...
- 【风马一族_xml】xml的基本讲解笔记
xml是如何保存数据的 在xml语言中,它允许用户自定义标签.每个标签用于描述一段数据; 一个标签可以分为开始标签和结束标签,在开始标签和结束标签之间又可以嵌套其它标签,利用标签间的嵌套其它标签,利用 ...
- 【风马一族_Android】让app上传到Android市场的网站介绍
豌豆荚 开发者中心 http://open.wandoujia.com/account/info China app http://www.chinaapp.org
- linux传送文件至服务器
scp安全文件拷贝(基于ssh的登陆) 1.你想把本地/home下的文件linux.tar.gz传送至远端服务器10.108.125.30,远端服务器的账号名为name,保存至服务器/home ...
- asp.net2.0 国际化
公司业务需要在国外开展了, 因此以前的系统要做多国语言了, 从网上搜集了好多资料, 最后选择了一个比较简单的方案 1. 打开vs2005, 新建网站, 首先在配置文件中添加配置: <syste ...
- RUP(Rational Unified Process)统一软件过程概述
RUP是Rational公司三位杰出的软件工程大师Grady Booch,Ivar Jacobson,James Rumbaugh提出的一个软件工程过程方法.软件开发过程是将一个用户需求转化为软件系统 ...