2014ACM/ICPC亚洲区广州站 北大命题
http://acm.hdu.edu.cn/showproblem.php?pid=5131
现场赛第一个题,水题。题意:给水浒英雄排序,按照杀人数大到小,相同按照名字字典序小到大。输出。然后对每个查询的名字,计数有多少人杀人数大于他,输出个数加1,计数有多少人杀人数相同,但名字小,如果没有不输出,否则输出个数加1。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct G{
string name;
int kill;
friend bool operator <(const G a,const G b){
return a.kill>b.kill||(a.kill==b.kill&&a.name<b.name);
}
}g[];
string str;
int main(){
int n,m,id;
while(~scanf("%d",&n),n){
for(int i=;i<n;i++){
cin>>g[i].name>>g[i].kill;
}
sort(g,g+n);
for(int i=;i<n;i++){
cout<<g[i].name<<" "<<g[i].kill<<endl;
}
scanf("%d",&m);
while(m--){
cin>>str;
for(int i=;i<n;i++){
if(str==g[i].name){
id=i;
break;
}
}
int ansa=,ansb=;
for(int i=;i<id;i++){
if(g[i].kill>g[id].kill){
ansa++;
}
else{
ansb++;
}
}
printf("%d",ansa);
if(ansb>){
printf(" %d",ansb);
}
puts("");
}
}
return ;
}
http://acm.hdu.edu.cn/showproblem.php?pid=5137
第二题,最短路。题意:给一个n点m边带权无向图,可以破坏2到n-1号中任意一个,问破坏哪个后1到n的最短路最长。做法:枚举破坏的点,对于每个最短路,求最大值。
#include<cstdio>
#include<cstring>
#include<queue>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
const int inf=0x3f3f3f3f;
bool can[];
class Spfa { ///单源最短路o(2*ME)
typedef int typec;///边权的类型
static const int ME=;///边的个数
static const int MV=;///点的个数
struct E {
int v,next;
typec w;
} e[ME];
int n,le,head[MV],inque[MV];
typec dist[MV];
bool used[MV];
queue<int> q;
public:
void init(int tn) { ///传入点的个数
n=tn;
le=;
mt(head,-);
}
void add(int u,int v,typec w) {
e[le].v=v;
e[le].w=w;
e[le].next=head[u];
head[u]=le++;
}
bool solve(int s) { ///传入起点,下标0开始,存在负环返回false
for(int i=; i<=n; i++) {
dist[i]=inf;
used[i]=true;
inque[i]=;
}
used[s]=false;
dist[s]=;
inque[s]++;
while(!q.empty()) q.pop();
q.push(s);
while(!q.empty()) {
int u=q.front();
q.pop();
used[u]=true;
for(int i=head[u]; ~i; i=e[i].next) {
int v=e[i].v;
if(can[v]) continue;
if(dist[v]>dist[u]+e[i].w) {
dist[v]=dist[u]+e[i].w;
if(used[v]) {
used[v]=false;
q.push(v);
inque[v]++;
if(inque[v]>n) return false;
}
}
}
}
return true;
}
typec getdist(int id) {
return dist[id];
}
} g;
int main(){
int n,m,u,v,w;
while(~scanf("%d%d",&n,&m),n|m){
g.init(n);
while(m--){
scanf("%d%d%d",&u,&v,&w);
g.add(u,v,w);
g.add(v,u,w);
}
int ans=;
for(int i=;i<n;i++){
mt(can,);
can[i]=true;
g.solve();
ans=max(ans,g.getdist(n));
}
if(ans==inf){
puts("Inf");
continue;
}
printf("%d\n",ans);
}
return ;
}
http://acm.hdu.edu.cn/showproblem.php?pid=5135
第三题,bfs。题意:给n个棒子的长度,可以任意挑3个一组组成三角形,不一定要全用完,问最后三角形之和最大是多少。做法:用二进制表示是否用过某个棒子,然后bfs。
bfs,有vis剪了一些情况40ms,vis去掉和下面dfs一样了
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
double area_triangle(double a,double b,double c) {//计算三角形面积,输入三边长
double s=(a+b+c)/;
return sqrt(s*(s-a)*(s-b)*(s-c));
}
double len[],ans;
bool vis[<<][<<];
int n;
struct Q{
int sta;
double area;
}now,pre;
queue<Q> q;
bool judge(double x,double y,double z){
return x+y>z&&x+z>y&&y+z>x;
}
void bfs(){
mt(vis,);
now.sta=;
now.area=;
while(!q.empty()) q.pop();
q.push(now);
while(!q.empty()){
pre=q.front();
q.pop();
ans=max(ans,pre.area);
for(int i=;i<n;i++){
if((pre.sta>>i)&) continue;
for(int j=i+;j<n;j++){
if((pre.sta>>j)&) continue;
for(int k=j+;k<n;k++){
if((pre.sta>>k)&) continue;
if(!judge(len[i],len[j],len[k])) continue;
now.sta=pre.sta|(<<i)|(<<j)|(<<k);
if(vis[pre.sta][now.sta]) continue;
vis[pre.sta][now.sta]=true;
now.area=pre.area+area_triangle(len[i],len[j],len[k]);
q.push(now);
}
}
}
}
}
int main(){
while(~scanf("%d",&n),n){
for(int i=;i<n;i++){
scanf("%lf",&len[i]);
}
ans=;
bfs();
printf("%.2f\n",ans);
}
return ;
}
dfs暴力所有情况171ms
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
const int M=;
int a[M],n;
bool use[M];
double ans;
bool judge(int x,int y,int z){
return x+y>z;
}
double area_triangle(double a,double b,double c) {//计算三角形面积,输入三边长
double s=(a+b+c)/;
return sqrt(s*(s-a)*(s-b)*(s-c));
}
void dfs(double sum){
ans=max(ans,sum);
for(int i=;i<n;i++){
if(use[i]) continue;
for(int j=i+;j<n;j++){
if(use[j]) continue;
for(int k=j+;k<n;k++){
if(use[k]) continue;
if(!judge(a[i],a[j],a[k])) continue;
use[i]=use[j]=use[k]=true;
dfs(sum+area_triangle(a[i],a[j],a[k]));
use[i]=use[j]=use[k]=false;
}
}
}
}
int main(){
while(~scanf("%d",&n),n){
for(int i=;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
mt(use,);
ans=;
dfs();
printf("%.2f\n",ans);
}
return ;
}
状态压缩dp,非常厉害15ms
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
const int M=;
int a[M],n;
double dp[<<];
vector<int> v;
bool judge(int x,int y,int z){
return x+y>z;
}
double area_triangle(double a,double b,double c) {//计算三角形面积,输入三边长
double s=(a+b+c)/;
return sqrt(s*(s-a)*(s-b)*(s-c));
}
int main(){
while(~scanf("%d",&n),n){
for(int i=;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
mt(dp,);
int big=<<n;
for(int i=;i<n;i++){
for(int j=i+;j<n;j++){
for(int k=j+;k<n;k++){
if(!judge(a[i],a[j],a[k])) continue;
int sta=(<<i)|(<<j)|(<<k);
dp[sta]=area_triangle(a[i],a[j],a[k]);
v.push_back(sta);
}
}
}
int lv=v.size();
for(int i=;i<big;i++){
for(int j=;j<lv;j++){
if(i&v[j]) continue;
int next=i|v[j];
dp[next]=max(dp[next],dp[i]+dp[v[j]]);
}
}
printf("%.2f\n",dp[big-]);
}
return ;
}
http://acm.hdu.edu.cn/showproblem.php?pid=5128
第四题,枚举。题意:给n个点,任意挑8个点构成两个不相交矩形,问能得到最大面积。做法:先处理出所有矩形,然后n^2枚举出两个矩形,如果一个矩形完全在另一个内,边不相交,那面积就是大的矩形的面积,如果相交了那是不合法的,否则就是两个矩形面积和,最后求个面积最大值。
#include<cstdio>
#include<cstring>
#include<vector>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
struct point{
int x,y;
}p[];
struct G{
int sx,sy,bx,by;
}now;
vector<G> g;
bool inside(G a,G b){
return a.sx>b.sx&&a.sy>b.sy&&a.bx<b.bx&&a.by<b.by;
}
int area(G a){
return (a.bx-a.sx)*(a.by-a.sy);
}
bool in(int x,int y,G b){
return x>=b.sx&&y>=b.sy&&x<=b.bx&&y<=b.by;
}
bool judge(G a,G b){
return in(a.sx,a.sy,b)||in(a.sx,a.by,b)||in(a.bx,a.sy,b)||in(a.bx,a.by,b);
}
bool vis[][];
int main(){
int n;
while(~scanf("%d",&n),n){
mt(vis,);
for(int i=;i<n;i++){
scanf("%d%d",&p[i].x,&p[i].y);
vis[p[i].x][p[i].y]=true;
}
g.clear();
for(int i=;i<n;i++){
for(int j=;j<n;j++){
if(p[i].x<p[j].x&&p[i].y<p[j].y){
if(!vis[p[i].x][p[j].y]) continue;
if(!vis[p[j].x][p[i].y]) continue;
now.sx=p[i].x;
now.sy=p[i].y;
now.bx=p[j].x;
now.by=p[j].y;
g.push_back(now);
}
}
}
int lg=g.size();
int ans=;
for(int i=;i<lg;i++){
for(int j=i+;j<lg;j++){
if(inside(g[i],g[j])||inside(g[j],g[i])){
ans=max(ans,max(area(g[i]),area(g[j])));
continue;
}
if(judge(g[i],g[j])||judge(g[j],g[i])) continue;
ans=max(ans,area(g[i])+area(g[j]));
}
}
if(!ans){
puts("imp");
continue;
}
printf("%d\n",ans);
}
return ;
}
A
题目:1 x y加入x,y ; -1 x y删去 x,y ; 0 a b 查询之前加入的x*a+y*b最大值
暴力n2能过,标程比暴力还慢。。
#include<cstdio>
typedef long long LL;
const int M=5e4+;
struct G{
LL x,y;
bool flag;
}q[M];
int main(){
int n,a;
LL b,c;
while(~scanf("%d",&n),n){
int lq=;
while(n--){
scanf("%d%lld%lld",&a,&b,&c);
if(a==){
q[lq].x=b;
q[lq].y=c;
q[lq].flag=true;
lq++;
continue;
}
if(a==-){
for(int i=;i<lq;i++){
if(!q[i].flag) continue;
if(q[i].x==b&&q[i].y==c){
q[i].flag=false;
break;
}
}
continue;
}
LL ans=-4e18,tmp;
for(int i=;i<lq;i++){
if(!q[i].flag) continue;
tmp=q[i].x*b+q[i].y*c;
if(ans<tmp){
ans=tmp;
}
}
printf("%lld\n",ans);
}
}
return ;
}
end
2014ACM/ICPC亚洲区广州站 北大命题的更多相关文章
- HDU 5127.Dogs' Candies-STL(vector)神奇的题,set过不了 (2014ACM/ICPC亚洲区广州站-重现赛(感谢华工和北大))
周六周末组队训练赛. Dogs' Candies Time Limit: 30000/30000 MS (Java/Others) Memory Limit: 512000/512000 K ( ...
- HDU 5135.Little Zu Chongzhi's Triangles-字符串 (2014ACM/ICPC亚洲区广州站-重现赛)
Little Zu Chongzhi's Triangles Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 512000/512000 ...
- HDU 5131.Song Jiang's rank list (2014ACM/ICPC亚洲区广州站-重现赛)
Song Jiang's rank list Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 512000/512000 K (Java ...
- 2014ACM/ICPC亚洲区北京站 上交命题
A http://acm.hdu.edu.cn/showproblem.php?pid=5112 输入n个时刻和位置,问那两个时刻间速度最快. 解法:按照时间排序,然后依次求相邻两个之间的速度,速度= ...
- 2014ACM/ICPC亚洲区广州站 Song Jiang's rank list
欢迎参加——每周六晚的BestCoder(有米!) Song Jiang's rank list Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- 2014ACM/ICPC亚洲区广州站题解
这一场各种计算几何,统统没有做. HDU 5129 Yong Zheng's Death HDU 5136 Yue Fei's Battle
- 2014ACM/ICPC亚洲区西安站 复旦命题
http://codeforces.com/gym/100548 A 签到 问一个序列是不是yes,yes的序列满足每个数都是3的倍数. #include<cstdio> int main ...
- 2014ACM/ICPC亚洲区鞍山站 清华命题
A http://acm.hdu.edu.cn/showproblem.php?pid=5070 先跳过. B http://acm.hdu.edu.cn/showproblem.php?pid=50 ...
- 2014ACM/ICPC亚洲区牡丹江站 浙大命题
A Average Score http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5373 a班有n个人,b班有m个人,bob在a ...
随机推荐
- nginx php 安装
.选定源码目录选定目录 /data/klj/ cd /data/klj/ 2.安装PCRE库cd /data/klj/wget ftp://ftp.csx.cam.ac.uk/pub/software ...
- Linux操作系统常用命令
http://www.cnblogs.com/huangzelin/p/5617611.html http://www.cnblogs.com/liumt/p/6117168.html
- 在Unity项目中使用Git
(搬运自我在SegmentFault的博客) 本文参考了Unity官网的Mastering Unity Project Folder Structure - Version Control Syste ...
- C 构造一个 简单配置文件读取库
前言 最近看到这篇文章, json引擎性能对比报告 http://www.oschina.net/news/61942/cpp-json-compare?utm_source=tuicool 感觉技术 ...
- 代码文档生成工具-Doxygen生成CHM和RTF图文教程
Doxygen是一种开源跨平台的,以类似JavaDoc风格描述的文档系统,可以从一套归档源文件开始,生成chm格式的文档.本文主要讲解如何在winddows下安装doxygen. 1.下载do ...
- MySQL使用rand函数实现随机数[转]
如何写一个语句能一下更新几百条MYSQL数据! 需要测试MYSQL数据库,里面有一个上万条数据的数据库,如何写一个PHP文件一下每次更新几百条信息,我都是写一个循环一次更新一条信息,这样我知道用WHI ...
- MySQL 触发器简单实例
~~语法~~ CREATE TRIGGER <触发器名称> --触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.{ BEFORE | ...
- [iOS]深入浅出 iOS 之多线程 NSThread
OS 支持多个层次的多线程 编程,层次越高的抽象程度越高,使用起来也越方便,也是苹果最推荐使用的方法. 下面简要说明这三种不同范式: Thread 是这三种范式里面相对轻量级的,但也是使用起 ...
- Linux下如何使CP命令不提示覆盖
在Linux下使用CP命令,经常会提示是否覆盖,如果是太批量的文件覆盖,老是这么提示,会很烦的.那如何解决这个问题呢? 我们先来看一下原因吧! 一般我们使用的命令是cp -rf sourcefile ...
- C++11 常用语法
1 新类型 C++ 11新增了long long和unsigned long long,以支持64bit宽度: 新增char16_t和char32_t以支持16位和32位字符表示: 增加了“原始”字符 ...