12.9补题

2019 ICPC Asia Taipei-Hsinchu Regional

比赛小tip(要改进!

1.J题一定要看清数据范围,不然就很容易想岔了

2.如果两个人都统一了思路,一个人拿不定(没有别的题目可以出了),可以看着一个人打代码,防止思路到手上,就飞了!!

3.(个人)要注意板子代表什么,比如我的旋转卡壳板子,以及运用板子有发生什么比如nS发小返回0,用一次,改变参数, 我的旋转卡壳中间n有加加操作,n的含义在本函数后面改变了。//叉积算的值就是三角形面积,(我是笨蛋

碎碎念)理解板子这么来的,我用的就是叉积来求最远点对的鸭,那就别直接使用的了鸭,而求最大面积用的就是叉积。

J题

题意

T组数据

给出n,m,m行,每行有n个由0或者1组成的元素

问最少选几组,可以使得每个位置至少覆盖了一次

0 < n <= 500,0 < m <= 15

题解

暴力做,开(1<<m)大小的数组,这个数用二进制表示,如果二进制上为1,则选了该数组。

可以用bitset做,快!!!比int快32倍左右!

#include <bits/stdc++.h>
using namespace std;
inline int count(int tmp) {
    int cnt = 0;
    while(tmp) {
        if(tmp & 1) cnt++;
        tmp >>= 1;
    }
    return cnt;
}

int main() {
    int T;
    scanf("%d", &T);
    while(T--) {
        int n, m;
        scanf("%d%d", &n, &m);
        bitset<510> a[20];
        for(int i = 0; i < m; i++) {
            cin >> a[i];
        }
        int ans = n + 1;
        for(int i = 0; i < (1 << m); i++) {
            int tmp = i;
            int tmp1 = i;
            bitset<510> b(0);
            int pos = 0;

            while(tmp) {
                if(tmp & 1) {
                    b = b | a[pos];
                }
                tmp >>= 1;
                pos++;
            }
            if(b.count() == n) {
                ans = min(ans, count(tmp1));
            }
        }
        if(ans != n + 1) printf("%d\n", ans);
        else printf("-1\n");
    }
}

L题

题意

问最大四边形的面积是多少,n < 4096

题解

建凸包,找两个点i,j(i != j)p1为i到j的三角形面积最大点,p2为j到i的三角形面积最大点。

You may not output numbers with scientific notaions. I.e., outputting 3E8 for 300000000 is not allowed.

//要用long long,不能用double

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iomanip>
using namespace std;
typedef long long ll;
const int MAX = 5e3 + 5;

struct Point{
    ll  x, y;
    bool operator < (const Point& b) const {
		return x < b.x || (x == b.x && y < b.y);
	}
};

Point p[MAX];

ll inline cross(Point a, Point b, Point c ,Point d) {
    return (a.x - b.x) * (c.y - d.y) - (c.x - d.x)* (a.y - b.y);
}

ll inline lenn(Point a, Point b) {
    return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}
Point ch[MAX];

int inline andrew(Point p[], Point ch[],int n) {//安德鲁算法求凸包,返回顶点数
    sort(p, p + n);
    int top = 0;
    for (int i = 0; i < n; i++) {
        while(top > 1 && cross(ch[top], ch[top - 1], p[i], ch[top]) <= 0) --top;
        ch[++top] = p[i];
    }
    int tmp = top;
    for(int i = n - 2; i >= 0; --i) {
        while((top > tmp) && cross(ch[top], ch[top - 1], p[i], ch[top]) <= 0) --top;
        ch[++top] = p[i];
    }
    if(n > 1) top--;
    return top;
}

int main() {
    ios::sync_with_stdio(0);
    int T;
    cin >>T;
    while(T--) {
    	int n;
    	cin >> n;
        for (int i = 0; i < n; i++)  cin >> p[i].x >> p[i].y;
        int cnt = andrew(p, ch, n);
        ch[0] = ch[cnt];

		if(cnt <= 4)  {
			ll ans = 0;
			for(int i = 0; i < n; i++) {
				for(int j = 0; j < n; j++) {
					for(int k = 0; k < n; k++) {
						for(int q = 0; q < n; q++) {
							if(i == j || i == k || i == q || j == k || j == q || k == q) continue;
							ll x = cross(p[i], p[j], p[k], p[q]);
							ans = max(ans, abs(x));
						}
					}
				}
			}
			if(ans & 1){
                cout << ans / 2 << ".5" << endl;
            }
            else cout << ans / 2 << endl;
		}
		else {
            ll ans = 0;
            for(int i = 0; i < cnt; i++) {
            	int p1 = (i + 1) % cnt, p2 = (i + 1) % cnt;
                //p1,p2放在外面,否则j变化,p2要每次从头开始遍历
                for(int j = (i + 2) % cnt; j != (i - 1 + cnt) % cnt; j = (j + 1) % cnt) {
                    if(i == j) continue;
                    
                    // i -- p1   j -- p2
                    while(cross(ch[i], ch[p1], ch[i], ch[j]) < cross(ch[i], ch[(p1 + 1) % cnt], ch[i], ch[j])) {
                    	if((p1 + 1) % cnt == j) break;
                    	p1 = (p1 + 1) % cnt;	
					}
                    while(cross(ch[i], ch[j], ch[i], ch[p2]) < cross(ch[i], ch[j], ch[i], ch[(p2 + 1) % cnt])) {
                    	if((p2 + 1) % cnt == i) break;
						p2 = (p2 + 1) % cnt;
					}
                        
                    ll x = cross(ch[i], ch[p1], ch[i], ch[j]) + cross(ch[i], ch[j], ch[i], ch[p2]);
                    ans = max(ans, x);
                }
            }
			if(ans & 1){
                cout << ans / 2 << ".5" << endl;
            }
            else cout << ans / 2 << endl;
		}
    }
}

debug//错误版本

// WA掉了
//原因p1,p2可能变成同一个点,这样就变成三角形了
//下图
ll ans = 0;
cnt++;
for(int i = 0; i < cnt; i++) {
    for(int j = 0; j < cnt; j++) {
        if(i == j) continue;
        int p1 = i + 1, p2 = j + 1;
        // i -- p1   j -- p2
        while(cross(ch[i], ch[p1], ch[i], ch[j]) < cross(ch[i], ch[(p1 + 1) % cnt], ch[i], ch[j])) {
        	if((p1 + 1) % cnt == j) break;
        	p1 = (p1 + 1) % cnt;	
		}
        while(cross(ch[j], ch[i], ch[j], ch[p2]) < cross(ch[j], ch[i], ch[j], ch[(p2 + 1) % cnt])) {
        	if((p2 + 1) % cnt == i) break;
			p2 = (p2 + 1) % cnt;
		}
            
        ll x = cross(ch[i], ch[p1], ch[i], ch[j]) + cross(ch[i], ch[j], ch[i], ch[p2]);
        ans = max(ans, x);
    }
}

在这里插入图片描述

// T
//原因 j变化,p2要每次从头开始遍历
ll ans = 0;
for(int i = 0; i < cnt; i++) {
    for(int j = (i + 2) % cnt; j != (i - 1 + cnt) % cnt; j = (j + 1) % cnt) {
        if(i == j) continue;
        int p1 = (i + 1) % cnt, p2 = (j + 1) % cnt;
        // i -- p1   j -- p2
        while(cross(ch[i], ch[p1], ch[i], ch[j]) < cross(ch[i], ch[(p1 + 1) % cnt], ch[i], ch[j])) {
        	if((p1 + 1) % cnt == j) break;
        	p1 = (p1 + 1) % cnt;	
		}
        while(cross(ch[i], ch[j], ch[i], ch[p2]) < cross(ch[i], ch[j], ch[i], ch[(p2 + 1) % cnt])) {
        	if((p2 + 1) % cnt == i) break;
			p2 = (p2 + 1) % cnt;
		}
            
        ll x = cross(ch[i], ch[p1], ch[i], ch[j]) + cross(ch[i], ch[j], ch[i], ch[p2]);
        ans = max(ans, x);
    }
}

C题(水)

题意

问是否对于每三个数a[i], a[j], a[k]都存在(a[i] - a[j]) / a[k]

数据范围 3 <= n <= 50

题解

模拟

H题(水)

题意

给n,问最大的a,满足 1 n = 1 a 异 或 b + 1 b \frac{1}{n} = \frac{1}{a 异或 b} + \frac{1}{b} n1=ab1+b1

题解
大胆猜测,如果没有思路的话
赛场是猜出来的,猜b = a + 1

O(1)

//严谨证明

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MJTrDtiH-1608117127612)(C:\Users\lili\AppData\Roaming\Typora\typora-user-images\image-20201216191037763.png)]

#include <iostream>
#include <cmath>
#include <cstdio>
#define ll  long long
using namespace std;
const int MAX = 56;

int main() {
	int n;
	scanf("%d", &n);
	double a[MAX];
	for(int i = 0; i < n; i++) {
		ll x;
		scanf("%lld", &x);
		ll ans = x * (x + 1);
		ll res = ans ^ (x + 1);
		printf("%lld\n", res);
	}	
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。在编写C程序时,需要注意变量的声明和定义、指针的使用、内存的分配与释放等问题。C语言中常用的数据结构包括: 1. 数组:一种存储同类型数据的结构,可以进行索引访问和修改。 2. 链表:一种存储不同类型数据的结构,每个节点包含数据和指向下一个节点的指针。 3. 栈:一种后进先出(LIFO)的数据结构,可以通过压入(push)和弹出(pop)操作进行数据的存储和取出。 4. 队列:一种先进先出(FIFO)的数据结构,可以通过入队(enqueue)和出队(dequeue)操作进行数据的存储和取出。 5. 树:一种存储具有父子关系的数据结构,可以通过中序遍历、前序遍历和后序遍历等方式进行数据的访问和修改。 6. 图:一种存储具有节点和边关系的数据结构,可以通过广度优先搜索、深度优先搜索等方式进行数据的访问和修改。 这些数据结构在C语言中都有相应的实现方式,可以应用于各种不同的场景。C语言中的各种数据结构都有其优缺点,下面列举一些常见的数据结构的优缺点: 数组: 优点:访问和修改元素的速度非常快,适用于需要频繁读取和修改数据的场合。 缺点:数组的长度是固定的,不适合存储大小不固定的动态数据,另外数组在内存中是连续分配的,当数组较大时可能会导致内存碎片化。 链表: 优点:可以方便地插入和删除元素,适用于需要频繁插入和删除数据的场合。 缺点:访问和修改元素的速度相对较慢,因为需要遍历链表找到指定的节点。 栈: 优点:后进先出(LIFO)的特性使得栈在处理递归和括号匹配等问题时非常方便。 缺点:栈的空间有限,当数据量较大时可能会导致栈溢出。 队列: 优点:先进先出(FIFO)的特性使得
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
CPLEX 12.9 是一个优化求解器,用于解决线性规划、整数规划、二次规划等数学优化问题。它基于高效的算法和先进的求解技术,能够处理大规模的问题并提供高质量的解决方案。 CPLEX 12.9 提供了丰富的功能和特性,可以有效地利用计算资源来解决复杂的优化问题。它支持多种编程接口和文件格式,使得用户可以方便地与不同的应用程序和环境集成。同时,CPLEX 12.9 还提供了直观的图形界面,用户可以可视化地设置和调整问题参数,并实时查看求解过程和结果。 CPLEX 12.9 具有高度的可扩展性和灵活性。它支持并行计算和分布式计算,可以利用多核和多台计算机的资源来加速求解过程。此外,它还提供了多种求解策略和启发式方法,用户可以根据问题的特点进行调整和优化,以获得更好的性能和解决方案。 CPLEX 12.9 的资源需求较低。它运行在常见的操作系统上,如Windows、Linux和Mac OS,可以在个人计算机、集群和云平台上运行。它对硬件的要求较低,可以在普通的计算机上进行求解,同时具有高效的内存管理和算法实现,能够有效地利用有限的资源来解决大规模问题。 综上所述,CPLEX 12.9 是一款功能强大且资源需求较低的优化求解器,可以广泛应用于各种领域,如物流、生产调度、金融投资等,帮助用户优化决策并提升效益。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值