先写下总结,当时第三题被黑了是好事情。自己当时想到了那种三个圆相切的局面,但后来又被自己给否定了,应该多画画图就出来了,不应该那样老是空想。而且需要搞个圆规了!
题目大意:那个divides是整除的意思,开始看了一段时间,小数除以大数什么意思?给你1-7很多数,分成很多组,每组有a,b,c,a<b<c且a|b,b|c。解题思路就很简单了,因为只能a<b<c,并且有整除关系只有1
2 4 ,1 2 6, 1 3 6三组。假设1,2,4的个数为a个,1, 2, 6的个数为b个,1, 3, 6的个数为c个。1就有a+b+c,2就有a+b,3就有c,4就有a,6就有b+c,5和7是0。这样判断即可。详见代码。
AC代码:
#include<iostream> #include<cstring> #include<string> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; int p[8]; int main() { int i,n,x; while(~scanf("%d",&n)) { memset(p,0,sizeof(p)); for(i=0;i<n;i++) { scanf("%d",&x); p[x]++; } if(p[5]>0||p[7]>0) { puts("-1"); continue; } int a,b,c; a=p[4],c=p[3],b=p[1]-a-c; if(b<0) puts("-1"); else { if(p[2]==a+b&&p[6]==b+c) { for(i=0;i<a;i++) printf("1 2 4\n"); for(i=0;i<b;i++) printf("1 2 6\n"); for(i=0;i<c;i++) printf("1 3 6\n"); } else puts("-1"); } } return 0; }
题目大意:给你n个人,每次只能往左走一步,或往右走一步。从s走到f问你最小走的路径,但是有m个规定,规定在第ti步的时候,从li到ri的位置都不能动。我的想法就是每次要么停着X,要么往右走。开始把if(s>f) swap(s,f)。开始犯2了。那样的话,需要输出往左走就只能哭瞎了!如果s<f要么停着X,要么往右走,如果s>f要么停着X,要么往左走。具体见代码。
AC代码:
#include<iostream> #include<cstring> #include<string> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; int t[100005],l[100005],r[100005]; int main() { int n,m,s,f,i; while(~scanf("%d%d%d%d",&n,&m,&s,&f)) { if(s<f) //往右走或停 { for(i=1; i<=m; i++) scanf("%d%d%d",&t[i],&l[i],&r[i]); int step=1; int pos=1; while(s<f) //如果s<f就停止 { while(t[pos]<step) pos++; //比它步数小的都过滤掉 if(step<t[pos]) { s++; step++; cout<<"R"; } else if(step==t[pos]) { if(s<l[pos]-1||s>r[pos]) //不在li到ri之内 { s++; step++; cout<<"R"; } else ////在li到ri之内 { step++; cout<<"X"; } } } cout<<endl; } else //往左走或停 { for(i=1; i<=m; i++) scanf("%d%d%d",&t[i],&l[i],&r[i]); int step=1; int pos=1; while(s>f) { while(t[pos]<step) pos++; if(step<t[pos]) { s--; step++; cout<<"L"; } else if(step==t[pos]) { if(s>r[pos]+1||s<l[pos]) //不在li到ri之内 { s--; step++; cout<<"L"; } else //在li到ri之内 { step++; cout<<"X"; } } } cout<<endl; } } return 0; } /* 3 5 1 3 1 1 2 2 2 3 3 3 3 4 1 1 10 1 3 3 5 3 1 1 1 2 2 2 3 3 3 3 4 1 1 10 1 3 */
题目大意:题目意思很简单,左边的是正面图,右边的图片是左视图。问你放半径为r/2.0的球最多能放多少个。由于半径是r/2.0,直接可以转换为二维平面上能含最多的圆。这个题目主要需要分类讨论,详见代码,开始只分了两类。但是结果被黑了,待会儿下面有图解,主要是有一种情况没有看到。在最后的十分钟的时候看到这个问题,当时没有认真想三圆相切,而是直接飘过了。。没有动笔画图的缺点暴露了。。
详见AC代码:
#include<iostream> #include<cstring> #include<string> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; int main() { double h,r; int sum=0; while(~scanf("%lf%lf",&r,&h)) { int p=(int)(h/r); if(h-r*p>=r/2.0*(sqrt(3.0))) sum=p*2+3; else if(h-r*p>=r/2.0) sum=p*2+2; else sum=p*2+1; cout<<sum<<endl; } return 0; }
刚为了准备画图,结果重新下ps cs6结果中木马了,桌面动不了了。开机了最后dns服务也被篡改了。搞了半天还是搞好了。。。!
打开网络中心--网络适配器。。ip可以自动获取没得问题。主要是dns服务器地址。当你可以上网的时候就按此处操作:点击左下角“开始”——“运行”—— 输入“cmd”确定——在命令提示符中输入“ipconfig/all”,之后就会显现DMS服务器地址,记住那个地址,把那个dns地址在本地连接的属性中写入就不会断网了。(开始上网时候都是自动获取的) 。