本文共 1904 字,大约阅读时间需要 6 分钟。
【题A】
【题解】
由于题目条件,x,y坐标的绝对值均在1e9以下,面积可能会到达1e18,所以无法用double储存。三角形的面积等于相邻两边叉积的一半,所以三角形面积的两倍一定是整数,我们可以用long long来储存,最后特判输出”.00”或”.50”。
对于找第k大,时间复杂度为O(n),可以利用nth_element。nth_element()函数(取容器中的第n大值)
头文件:#include<algorithm>
作用:nth_element作用为求第n大的元素,并把它放在第n位置上,下标是从0开始计数的,也就是说求第0小的元素就是最小的数。
注意:nth_element()函数不过将第n大的数排好了位置,并不返回值。
【代码】
#includeusing namespace std;#define ll long longstruct p{ ll x,y;}f[85];int main(){ int t; scanf("%d",&t); while(t--) { int n,k; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) scanf("%lld%lld",&f[i].x,&f[i].y); vector v; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) for(int k=j+1;k<=n;k++) { ll area=abs((f[j].x-f[i].x)*(f[k].y-f[i].y)-(f[k].x-f[i].x)*(f[j].y-f[i].y)); v.push_back(area); } nth_element(v.begin(),v.begin()+v.size()-k,v.end()); ll ans=v[v.size()-k]; if (ans%2==0) printf("%lld.00\n",ans/2); else printf("%lld.50\n",ans/2); } return 0;}
【题C】
【题解】
对于每个砝码,可以选择放左边、不放、放右边三种情况,所以可以按三进制进行排列即可。
选择砝码如下:1,3,9,27,…选m个数最多能称出的重量为: 注意高精度。
【代码】
import java.math.BigDecimal; import java.util.Scanner; import java.math.BigInteger; public class Main { public static void main(String args[]) { Scanner scan = new Scanner(System.in); BigInteger a; BigInteger b = new BigInteger("1"); BigInteger c=new BigInteger("3"); BigInteger ad=new BigInteger("1"); a = scan.nextBigInteger(); int cnt=1; while(a.compareTo(b)>0) { cnt++; b=b.multiply(c); b=b.add(ad); } System.out.println(cnt); return; }}
【题J】
【题解】
优先复习先考的科目,如果复习完超过考试时间就复习不完输出NO,否则加上考试的两小时。简单贪心。
【代码】
typedef long long int ll;const int maxn=1e5+5;struct p{ ll a,b;}f[maxn];bool cmp(p x,p y){ return x.b
转载地址:http://efben.baihongyu.com/