2016年10月4日 训练 QAQ

 

献给我的女神们 μ's 

 

今天不小心AK了QAQ

电阻

【问题描述】
首长最近物理进了省队~~专心攻读物理。
现在首长物理帝要做一个实验,需要一个阻值为 A / B 的电阻,但是他手上只有无
数个阻值为1的电阻和无数根导线(富有的SZ提供给首长超导体进行实验,所以忽略
导线自身的电阻),所以首长只好连接一个阻值为A / B的等效电路进行实验,他开始选
一个阻值为1的电阻,之后他可以在原来的电路上进行以下操作之一,从而得到一个新
的电路,并且老师规定对于以下操作不限制次数:
1、串联一个阻值为1的电阻。
2、并联一个阻值为1的电阻。
新的电路仍然可以执行以上两个操作。
当然为了精确,所用的电阻个数要尽量少。现在首长巨巨早就知道他至少需要多少
个电阻才能完成这个任务,但他不屑于写这题的代码,于是这个任务就交给你了。当然
如果无解,则输出OrzCSQ。
【输入格式】
输入只含一行包含两个整数A和B。
【输出格式】
一个正整数,表示首长巨巨至少需要用到的电阻个数。
【输入输出样例】
5 2 4
【样例说明】
先将2个阻值为1的电阻并联,再将这个并联后的电路串联2个阻值为1的电阻即
可。
【数据规模】
对于30%的数据满足A, B ≤ 20;
对于100%的数据满足0 ≤ A ≤ 10^18 ,1 ≤ B ≤ 10^18。

题解:30分你可以随便xjb写个bfs。100分你会发现,串联一个电阻相当于(a+b)/b 并联相当于a/(a+b) 然后你会发现,你可以从a/b一直辗转相除。。然后就做出来了

p.s. 当a=0 无解。

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 long long a,b,ans;
 5 void gcd()
 6 {   long long r=a%b;
 7     ans+=a/b;
 8     while(r)
 9       {a=b;
10        b=r;
11        r=a%b;
12        ans+=a/b;
13       }
14     cout<<ans<<endl;
15 }
16 int main()
17 {   
18     cin>>a>>b;
19     if(a==0)
20       cout<<"OrzCSQ"<<endl;
21     else
22       gcd();
23     fclose(stdin);
24     fclose(stdout);
25     return 0;
26 }
FAQ

路由器

【问题描述】
SZ正在建设信息化校园,要配备无线网络。为了能在增强网络信号的同时尽量满
足同学们在每个教室都能连上无线网络的心愿,信息组想出了一个神奇的方法——在每
一层楼布置路由器,则每一台路由器的有效信号区域为以其为圆心、R为半径的圆覆盖
的区域。现在我们只讨论关于高一所有教室(在同一层楼)的信号覆盖问题。
SZ总务处共购进了M个路由器分配给高一段所在的楼层,由于建筑师巧(er)妙(bi)
的设计,所有的N个高一教室分布在一条直线上且教室间的间隔不一定相等。为了尽量
满足学生的要求,每一个教室必须被至少一台路由器覆盖到。现在的问题是所有路由器
的覆盖半径是一样的,为定值R,我们希望用R尽可能小的路由器来完成任务,因为这
样可以节省成本。
信息组知道你正在学习程序设计,便将求出这个R的任务交给你。当然,为了方便
计算,学生答应只要信号覆盖到这一间教室的中心点就算覆盖了整间教室,而SZ将给
出这N间教室的中心点在所有教室构成的直线上的坐标。由于工程师技(zhi)术(shang)
有限,所以要求输出的R必须保留一位小数(四舍五入)。
【输入格式】
输入文件第一行包含两个整数M和N,以下N行每行一个整数Hi表示教室的中心
点在所有教室构成的直线上的坐标。
【输出格式】
输出文件仅包含一个数,表示最小的覆盖半径,保留一位小数(四舍五入)。
【输入输出样例】
2 3
1
3
10
1.0
【数据规模】
对于60%的数据,有1 ≤N, M ≤100,-1000 ≤Hi ≤1000;
对于100%的数据,有1 ≤N, M ≤100000,-10000000 ≤Hi ≤10000000。

题解:看到题目就知道是比较容易看出来的二分答案题了。(话说这类题目都差不多啊。。参考noip2015 day2 河中跳房子)

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <stdio.h>
 4 #include <cmath>
 5 #include <string>
 6 #include <string.h>
 7 #include <numeric>
 8 #define gc getchar()
 9 #define REM main
10 using namespace std;
11 int n,m;
12 int d[233333];
13 int read()
14 {
15     int xxxx=0,fuh=1;char ch=gc;
16     while(!isdigit(ch)){
17         if(ch=='-')fuh=-1;
18         ch=gc;
19     }
20     while(isdigit(ch)){
21         xxxx=(xxxx<<3)+(xxxx<<1)+ch-'0';ch=gc;
22     }
23     return xxxx*fuh;
24 }
25 bool check(float dis)
26 {
27     int i;
28     float temp=dis*2;
29     int cnt=1;
30     int pre=1;
31     for (i=2;i<=n;i++)
32       {
33         if (d[i]-d[pre]>temp)
34           pre=i,cnt++;
35       }
36     if (cnt<=m) return 1;
37     else return 0;
38 }
39 int REM()
40 {
41     
42     m=read();
43     n=read();
44     int i;
45     for (i=1;i<=n;i++)
46       d[i]=read();
47  
48     float mid,l,r;
49     l=0;r=d[n]-d[1];
50     while(l+0.01<r)
51       {
52           mid=(l+r)*1.0/2;
53           if (!check(mid))
54             l=mid+0.01;
55         else
56           r=mid-0.01;
57       }
58     printf("%.1lf",l);
59     return 0;
60 }
qwq

跑路

【问题描述】
ZRY的工作不仅繁琐,更有苛刻的规定。BOSS要求ZRY每天早上在6:00之前到
达公司,否则这个月工资清零。可是ZRY偏偏又有赖床的坏毛病。于是为了保住自己
的工资,ZRY买了一个十分牛B的空间跑路器,每秒钟可以跑2^k千米(k是自然数,
每秒可以任意指定一个k)。当然,这个机器是用int32 存的,所以总跑路长度不能超
过2^31-1千米。
ZRY的家到公司的路可以看做一个有向图,ZRY家为点1,公司为点N,每条边
长度均为一千米。ZRY想每天能醒地尽量晚,所以让你帮他算算,他最少需要几秒才能
到公司。数据保证1到N至少有一条路径。
【输入格式】
第一行两个整数N,M,分别表示点的个数和边的个数。
接下来M行每行两个数字u,v,表示一条u到v的边。
【输出格式】
一行一个数字,表示到公司的最少秒数。
【输入输出样例】
4 4
1 1
1 2
2 3
3
1
【数据规模】
对于50%的数据,满足最优解路径长度 ≤ 1000;
对于100%的数据,满足N ≤ 50,m ≤ 10000,最优解路径长度 ≤ maxlongint

题解:看到题目中的2^k就觉得好像也许应该可能大概要用倍增之类的什么玩意儿吧..我们假装a[i][j][k]表示i到j是否有一条2^k的路径,然后我们就可以xjb转移了呀

a[i][j][k]=1 |  a[i][j][k-1]==1&&a[j][p][k-1]==1

然后就可以将i,j连边,边权为2^k。。然后跑floyed什么的就过了

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <stdio.h>
 4 #include <cmath>
 5 #include <string>
 6 #include <string.h>
 7 #include <numeric>
 8 #define gc getchar()
 9 #define REM main
10 using namespace std;
11 int n,m,i,j,l,k,dis[100][100],a[100][100][100];
12 int read()
13 {
14     int xxxx=0,fuh=1;char ch=gc;
15     while(!isdigit(ch)){
16         if(ch=='-')fuh=-1;
17         ch=gc;
18     }
19     while(isdigit(ch)){
20         xxxx=(xxxx<<3)+(xxxx<<1)+ch-'0';ch=gc;
21     }
22     return xxxx*fuh;
23 }
24 /*int pow4(int a,int b)
25 {
26     int r=1,base=a;
27     while(b!=0)
28     {
29         if(b&1)
30             r*=base;
31         base*=base;
32         b>>=1;
33     }
34     return r;
35 }*/
36 int REM()
37 {
38     
39     n=read();
40     m=read();
41     for (i=1;i<=n;i++)
42       for (j=1;j<=n;j++)
43         dis[i][j]=1000000;
44     for (i=1;i<=m;i++)
45       {
46           int temp1,temp2;
47           temp1=read();
48           temp2=read();
49           a[temp1][temp2][0]=1;
50           dis[temp1][temp2]=1;
51       }
52     for (i=1;i<=64;i++)
53       for (j=1;j<=n;j++)
54          for (l=1;l<=n;l++)
55             for (k=1;k<=n;k++)
56                if(a[l][j][i-1]==1&&a[j][k][i-1]==1)
57               {
58                 a[l][k][i]=1;
59                    dis[l][k]=1;
60               }
61     for(i=1;i<=n;i++)
62       for (j=1;j<=n;j++)
63          for(k=1;k<=n;k++)
64                 dis[j][k]=min(dis[j][k],dis[j][i]+dis[i][k]);// fU**k
65     printf("%d",dis[1][n]);
66     return 0; 
67 }
cy(划去)

QAQ是不是很简单呀。。比较今天三个人ak了QAQ

噗~~~

转载于:https://www.cnblogs.com/yz12138/p/5931464.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值