题目来自UKIEPC2017
有n个星球,输入每个星球一天的时间,日出和日落的时间。从日落到日出(包括日出、日落)是黑夜。其他的为白天。问在前1825天里能不能有一个时辰满足所有的星球都是夜晚。
直接模拟
1 #include<bits/stdc++.h> 2 using namespace std; 3 bool ap[200050]; 4 int main() 5 { 6 int n,hh; 7 scanf("%d",&n); 8 hh=0; 9 int h,r,t; 10 while(n--) 11 { 12 scanf("%d %d %d",&h,&r,&t); 13 hh=max(h,hh); 14 r++; 15 t++; 16 if(t<r) 17 { 18 for(int i=1;i<t;i++) 19 ap[i]=1; 20 t=t+h; 21 } 22 int cnt; 23 for(int i=r+1;i<=t-1;i++) 24 { 25 cnt=0; 26 while(i+h*cnt<=183000) 27 { 28 ap[i+h*cnt]=1; 29 cnt++; 30 } 31 } 32 } 33 for(int i=1;i<=hh*1825;i++) 34 if(ap[i]==0) 35 { 36 printf("%d\n",i-1); 37 return 0; 38 } 39 printf("impossible\n"); 40 return 0; 41 }
给出一个二维多边形按逆时针方向的坐标,让该多边形的某一方向能放在一个长方形里,求该长方形的最小宽度。
根据给出的点建立凸包,然后枚举凸包的每条边,计算凸包的其他点到该边的最大值,然后再找到这些最大值的最小值
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 struct Point //定义点 5 { 6 double x,y; 7 Point(double x=0,double y=0):x(x),y(y){} 8 }; 9 typedef Point Vector; 10 bool cmp(Point a,Point b) //排序方式 11 { 12 return a.x<b.x||(a.x==b.x&&a.y<b.y); 13 } 14 Vector operator - (Point A,Point B){return Vector(A.x-B.x,A.y-B.y);}//重载减法号 15 double Cross(Vector A,Vector B) 16 { 17 return A.x*B.y-A.y*B.x; 18 } 19 double Dot(Vector A,Vector B) 20 { 21 return A.x*B.x+A.y*B.y; 22 } 23 double Length(Vector A) 24 { 25 return sqrt(Dot(A,A)); 26 } 27 int n; 28 Point ch[200],p[200]; 29 int ConvexHull() //凸包模板 30 { 31 sort(p,p+n,cmp); 32 int m=0; 33 for(int i=0;i<n;i++) 34 { 35 while(m>1&&Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0) m--; 36 ch[m++]=p[i]; 37 } 38 int k=m; 39 for(int i=n-2;i>=0;i--) 40 { 41 while(m>k&&Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0) m--; 42 ch[m++]=p[i]; 43 } 44 if(n>1) m--; 45 return m; 46 } 47 double Distance(Point P,Point A,Point B) //点P到AB边的距离 48 { 49 Vector v1=B-A,v2=P-A; 50 return fabs(Cross(v1,v2))/Length(v1); 51 } 52 int main() 53 { 54 // freopen("in.txt","r",stdin); 55 56 scanf("%d",&n); 57 for(int i=0;i<n;i++) 58 { 59 scanf("%lf%lf",&p[i].x,&p[i].y); 60 } 61 int nn=ConvexHull(); 62 double maxn,minn=(double)1000000007; 63 for(int i=1;i<nn;i++) //枚举每条边 64 { 65 maxn=-1; 66 if(i>1) 67 { 68 for(int j=0;j<i-1;j++) 69 { 70 if(Distance(ch[j],ch[i],ch[i-1])>maxn) 71 maxn=Distance(ch[j],ch[i],ch[i-1]); 72 } 73 } 74 for(int j=i+1;j<nn;j++) 75 { 76 if(Distance(ch[j],ch[i],ch[i-1])>maxn) 77 maxn=Distance(ch[j],ch[i],ch[i-1]); 78 } 79 if(maxn<minn) 80 minn=maxn; 81 } 82 maxn=-1; 83 for(int i=1;i<nn-1;i++) //不要忘了ch[nn-1]ch[0]这条边 84 { 85 if(Distance(ch[i],ch[0],ch[nn-1])>maxn) 86 maxn=Distance(ch[i],ch[0],ch[nn-1]); 87 } 88 if(maxn<minn) 89 minn=maxn; 90 printf("%.6lf\n",minn); 91 return 0; 92 }
直接模拟
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 int main() 6 { 7 int a[10]={0}; 8 int n; 9 cin>>n; 10 string s; 11 for(int i=0;i<n;i++) 12 { 13 cin>>s; 14 if(s=="yellow") a[2]++; 15 else if(s=="green") a[3]++; 16 else if(s=="brown") a[4]++; 17 else if(s=="blue") a[5]++; 18 else if(s=="pink") a[6]++; 19 else if(s=="black") a[7]++; 20 else a[1]++; 21 } 22 int pos; 23 for(int i=7;i>=1;i--) 24 { 25 if(a[i]) 26 { 27 pos = i; 28 break; 29 } 30 } 31 int ans = 0; 32 if(pos==1) 33 { 34 cout<<1<<endl; 35 return 0; 36 } 37 else 38 ans += (1+pos)*a[1]; 39 40 for(int i=pos;i>=2;i--) 41 ans+=a[i]*i; 42 cout<<ans<<endl; 43 return 0; 44 }
直接按照题目意思做
1 #include<bits/stdc++.h> 2 using namespace std; 3 char s[1005]; 4 int main() 5 { 6 scanf("%s",s); 7 int len=strlen(s); 8 int a[100005],b[100005],cnt1=0; 9 for(int i=0;i<len;i++) 10 { 11 for(int j=i+1;j<len;j++) 12 { 13 if(s[i]>s[j]) 14 { 15 a[cnt1]=i+1; 16 b[cnt1]=j+1; 17 cnt1++; 18 swap(s[i],s[j]); 19 } 20 } 21 } 22 for(int i=cnt1-1;i>=0&&i>=cnt1-10000;i--) 23 { 24 printf("%d %d\n",b[i],a[i]); 25 } 26 return 0; 27 }
该题与原题输出不同,请注意!
对于该题来说,直接写。
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 const int maxn = 5005; 6 7 int main() 8 { 9 int n,m; 10 cin>>n>>m; 11 int a[maxn]; 12 int b[maxn]; 13 for(int i=0;i<n;i++) 14 cin>>a[i]; 15 for(int i=0;i<m;i++) 16 cin>>b[i]; 17 int x; 18 for(int i=0;i<m;i++) 19 cin>>x; 20 sort(a,a+n); 21 sort(b,b+m); 22 int now = 0; 23 for(int i=0;i<m;i++) 24 { 25 if(a[now]<=b[i]) 26 now++; 27 if(now==n) 28 break; 29 } 30 if(now==n) 31 { 32 cout<<"possible"<<endl; 33 return 0; 34 } 35 else 36 { 37 cout<<"impossible"<<endl; 38 return 0; 39 } 40 return 0; 41 }
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 double dp[405][405]; 5 int main() 6 { 7 int n,k; 8 scanf("%d%d",&n,&k); 9 dp[0][0] = 1; 10 for(int i=0; i<k; i++) 11 { 12 for(int j=0; j<=n; j++) 13 { 14 if(dp[i][j]==0) 15 continue; 16 if(n-j>=1) 17 { 18 dp[i+1][j+1] += dp[i][j]*0.5; 19 dp[i+1][j] += dp[i][j]*0.5; 20 } 21 else 22 { 23 dp[i+1][j] += dp[i][j]*0.5; 24 dp[i+1][j-1] += dp[i][j]*0.5; 25 } 26 } 27 } 28 double ans = 0; 29 for(int i=1;i<=n;i++) 30 ans+=dp[k][i]*i; 31 printf("%.6f",ans); 32 return 0; 33 }
求能产生最大余数的那个数
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 int n,h[100],t; 5 int main() 6 { 7 scanf("%d",&n); 8 for(int i=0;i<n;i++) 9 scanf("%d",&h[i]); 10 scanf("%d",&t); 11 int tmp,pos,ans=3005; 12 for(int i=0;i<n;i++) 13 { 14 tmp=t%h[i]; 15 if(tmp<ans) 16 { 17 ans=tmp; 18 pos=i; 19 } 20 } 21 printf("%d\n",h[pos]); 22 return 0; 23 }
直接按照题意写
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 int main() 6 { 7 int op,n; 8 double ans=0; 9 scanf("%d",&n); 10 while(n--) 11 { 12 scanf("%d",&op); 13 if(op==0) 14 { 15 ans+=2; 16 } 17 else 18 { 19 ans+=(double)1.0/(op*1.0); 20 } 21 } 22 printf("%.6lf\n",ans); 23 return 0; 24 }