10.30 task 二进制+精度+DP

alien

题目描述

⼩ Y 最近正在接受来⾃ X3 星球的外星⼈的采访。在那个星球上,每个⼈的名字都是⼀个正整数。
所有在这个星球上的居民都是相互认识的。两个这个星球上的⼈的友谊值可以⽤这样来计算: 先把两个⼈
的名字转换成二进制,然后把他们上下对齐排好,如果同⼀列的值相等,那么相应列的值就是 0,否则的
话就是 1,结果最后仍旧转换成⼗进制数。 (即 Xor 操作)
例如,两个⼈的名字是 19 和 10,他们的友谊值是 25
这个星球的价值是这么计算的: 所有友情值的和。⼩ Y 邀请你帮助他来计算这个值。
Input
输⼊⽂件第⼀⾏⼀个整数 N, 表⽰这个星球上的总⼈⼜。
接下来 N ⾏,每⾏⼀个正整数,表⽰每个居民的姓名。
Output
输出⽂件⼀⾏⼀个整数,表⽰这个星球的价值。
Example
alien.in alien.out
2
19
10
25
3735
12
59
13
196
84
Scoring
• 对于 40% 的数据, N ≤ 5000。
• 对于 70% 的数据, N ≤ 100000。
• 对于 100% 的数据, N ≤ 106, 每个居民的姓名小于 106

题解

暴力很好打,N^2枚举即可
正解是记录从1~i每一个二进制位上0的个数,1的个数
判断i+1的这一位是0/1,计入答案

代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long  n,m;
long long ans;
long long cnt[2][50];
int main(){
    freopen("alien.in","r",stdin);
    freopen("alien.out","w",stdout);
    scanf("%lld",&n);
    for(int i=1;i<=n;i++){
        scanf("%lld",&m);
        for(int j=25;j>=0;j--){
            int b=(m>>j)&1;
            cnt[b][j]++;
            ans+=(cnt[b^1][j]*(1<<j));
        }
    }
    printf("%lld",ans);
    return 0;
}

polyline

题目描述

懒得截图了,看这个吧233
http://www.cnblogs.com/jaywang/p/7748279.html

题解

s的图像角度如果不是180度,即s的拐点的个数
那么一定是y中的某一个或多个函数图像出现了拐点

y函数图像出现拐点,一定是在函数值为0的时候,算出这个拐点的x坐标,统计一共有多少个不同横坐标的拐点

注意精度
double 卡到1e-8是不行的
long double 卡到1e-18 √

lj精度,毁我青春

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100000+500;
int n,tot,cnt;
long double num[N];
double k,b;
int main(){
    freopen("polyline.in","r",stdin);
    freopen("polyline.out","w",stdout); 
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%lf%lf",&k,&b);
        if(k)
        num[++cnt]=-(b/k);
    }
    sort(num+1,num+cnt+1);
    for(int i=1;i<=cnt;i++){
        if(i>1&&num[i]-num[i-1]<=1e-18) continue;
        else tot++;
    }
    printf("%d",tot);
    return 0;
}

roadwork

现在有⼀条单个车道的路,两边会不断有车来,任意时刻路上只能有⼀个⽅向的车,每辆车速度相
同,同⼀⽅向的车必须在前⼀辆车上路 3 秒后才能上路,可以在路⼜等待,不能超车,每个⼈在路⼜等
过其忍受范围后便会不⾼兴,现在请你安排过路顺序,使得不⾼兴的⼈数最少。
Input
第⼀⾏两个整数 t 和 n,代表有 n 辆车,每辆车过桥时间为 t 秒
下⾯ n ⾏,述每辆车,每⾏⼀个字符 c,两个数字 a 和 r;
c=“E”或“W”代表⽅向, a 代表到达时间 (秒), r 代表最⼤忍受时间 (秒,上路时间 - a),按到来顺序
给出, a 相同时以到来顺序为准。
Output
输出⼀⾏⼀个整数,代表最少发怒⼈数。
Example
roadwork.in roadwork.out
8 3
W 10 0
W 10 3
E 17 4
0

100 5
W 0 200
W 5 201
E 95 1111
E 95 1
E 95 11
1
对于 100% 的数据, 4 ≤ t ≤ 180; 1 ≤ n ≤ 250; 0 ≤ a < 86400; 0 ≤ r ≤ 3600

题解 :细节处理好像很麻烦,我没调出来
f[i][j][k][0/1]
原:KJ存的为a出发时间(到目前为止),f为最少发怒人数 
现在: 
[0/1]表示最后车是左边还是右边走 
i左边已经走j右边 已经有k个人生气 
f表示的是最少时间 
转移是枚举
看下面走左还是走右 
纪律最后一辆走的车为左还是右 
f[i+1][j][k][0]左
f[i][j+1][k][1]右 
if(<发怒时间) k
else k+1
转移时对于最后一位: 
0转移到03s
1转移到0ts
最终找f[n][m][k][0/1](初始无穷大)(k位我们能找到的最小值) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值