目录
- 看不见的手
- ljj的方块
- 零它来了
- 宝石转换
- ljj的距离
- 零它走了
- 彩蛋
题目
【A NKOJ-P8629】 看不见的手 40pts
考试思路:
这道题一看数据范围就知道是 O ( n ) O(n) O(n)的结论题,考试的时候脑子抽筋偏分输出1得了40pts;
正解:
他说呆呆会使总利润最高,那我们就从呆呆的角度去思考他的最优解;不难发现,呆呆赚取的利润是 卖出点价格 − 买入点价格 {\small\ \mathsf{卖出点价格}-\mathsf{买入点价格}} 卖出点价格−买入点价格;而在每个点呆呆可以买很多个口罩( T T T允许的话),所以呆呆肯定会在使数对 ( a i , a j ) (a_i,a_j) (ai,aj)的 a j − a i a_j-a_i aj−ai差值最大的 ( i , j ) (i,j) (i,j)点买入卖出;而我们要使呆呆少赚钱,我们只需要将这个数对变为: ( a i + 1 , a j ) 或 ( a i , a j − 1 ) (a_i+1,a_j){\small\ \mathsf{或}}(a_i,a_j-1) (ai+1,aj) 或(ai,aj−1),花费为1;
思路很明显了,由于使 a j − a i a_j-a_i aj−ai差值最大的 ( i , j ) (i,j) (i,j)可能不止一个,所以我们只需要求出这样的 ( i , j ) (i,j) (i,j)有多少个再乘上每一个数对的价值 1 1 1,就是答案
Ac Code
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,t,a[100005];
int minnum,maxnum,ans;
signed main(){
scanf("%lld%lld",&n,&t);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);}
minnum=a[1];
for(int i=2;i<=n;i++){
minnum=min(minnum,a[i-1]);
if(a[i]-minnum>maxnum){
maxnum=a[i]-minnum;
ans=0;
}
if(a[i]-minnum==maxnum){
ans++;}
}
printf("%lld",ans);
return 0;
}
【B NKOJ-P10089】ljj的方块 15pts
考试思路:
输出0
,直接骗分;(逃
正解:
先枚举其中任意两个有小黑子的点,在用公式推出剩余两个点的坐标,判断这两个点是否是在小黑子上,推理过程如图,其中涂色三角形是全等的,我们可以利用全等导边;(这个十分滴恶心)
所以我们可以得到下面的结论
x 1 = y y + ( x − x x ) y 1 = x x + ( y − y y ) x 2 = y + ( x − x x ) y 2 = x + ( y − y y ) x1=yy+(x-xx) \\ y1=xx+(y-yy) \\ x2=y+(x-xx) \quad \\ y2=x+(y-yy)\quad x1=yy+(x−xx)y1=xx+(y−yy)