献给我的女神们 μ'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 }
路由器
【问题描述】
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 }
跑路
【问题描述】
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 }
QAQ是不是很简单呀。。比较今天三个人ak了QAQ
噗~~~