日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

UPC2018组队训练赛第六场

發(fā)布時(shí)間:2023/12/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UPC2018组队训练赛第六场 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目來(lái)自UKIEPC2017


?

A題:Alien Sunset

有n個(gè)星球,輸入每個(gè)星球一天的時(shí)間,日出和日落的時(shí)間。從日落到日出(包括日出、日落)是黑夜。其他的為白天。問在前1825天里能不能有一個(gè)時(shí)辰滿足所有的星球都是夜晚。

直接模擬

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 } View Code

?

B題:Breaking Biscuits

給出一個(gè)二維多邊形按逆時(shí)針方向的坐標(biāo),讓該多邊形的某一方向能放在一個(gè)長(zhǎng)方形里,求該長(zhǎng)方形的最小寬度。

根據(jù)給出的點(diǎn)建立凸包,然后枚舉凸包的每條邊,計(jì)算凸包的其他點(diǎn)到該邊的最大值,然后再找到這些最大值的最小值

1 #include <bits/stdc++.h> 2 3 using namespace std; 4 struct Point //定義點(diǎn) 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);}//重載減法號(hào) 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) //點(diǎn)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 } View Code

?

C題:Cued In

直接模擬

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 } View Code

?

D題:Deranging Hat

直接按照題目意思做

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 } View Code

??

E題:Education

該題與原題輸出不同,請(qǐng)注意!

對(duì)于該題來(lái)說(shuō),直接寫。

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 } View Code

?

F題:Flipping Coins

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 } View Code

?

I題:I Work All Day

求能產(chǎn)生最大余數(shù)的那個(gè)數(shù)

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 } View Code

?

J題:Just A Minim

直接按照題意寫

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 } View Code

?

L題:Lounge Lizards

給出電視機(jī)的坐標(biāo),有n個(gè)人,分別輸入他們的坐標(biāo)和高度,可以把某些人趕出去,問最多能有多少人能看到電視

首先求出每個(gè)人與電視機(jī)的方向向量,并約分,然后對(duì)于每組求LIS,最后取和

1 #include <bits/stdc++.h> 2 3 using namespace std; 4 typedef long long ll; 5 int n; 6 const int inf=0x3f3f3f3f; 7 const int maxn = 1e6+5; 8 struct P 9 { 10 int x,y,h; 11 ll dis; 12 }a[maxn],o; 13 int dp[maxn]; 14 int gcd(int a,int b) 15 { 16 return b?gcd(b,a%b):a; 17 } 18 bool cmp(P a,P b) 19 { 20 if(a.x!=b.x) return a.x<b.x; 21 else if(a.y!=b.y) return a.y<b.y; 22 else return a.dis<b.dis; 23 } 24 int f(int l,int r) //O(nlog(n))的復(fù)雜度 25 { 26 int idx=1,where; 27 // for(int i=l;i<r;i++) //初始化可加也不可加 28 // dp[i]=inf; 29 dp[idx]=a[l].h; 30 for(int i=l+1;i<r;i++) 31 { 32 if(a[i].h>dp[idx]) 33 { 34 idx++; 35 dp[idx]=a[i].h; 36 } 37 else 38 { 39 where=lower_bound(dp+1,dp+idx+1,a[i].h)-dp; 40 dp[where]=a[i].h; 41 } 42 } 43 return idx; 44 } 45 int main() 46 { 47 scanf("%d%d",&o.x,&o.y); 48 scanf("%d",&n); 49 for(int i=0; i<n; i++) 50 { 51 scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].h); 52 a[i].x -= o.x; 53 a[i].y -= o.y; 54 a[i].dis = (ll)a[i].x*a[i].x + (ll)a[i].y*a[i].y; //注意要在每一項(xiàng)上加上(ll) 55 int t = gcd(abs(a[i].x),abs(a[i].y)); 56 a[i].x/=t; 57 a[i].y/=t; 58 } 59 sort(a,a+n,cmp); //排序 60 int j; 61 int ans = 0; 62 for(int i=0; i<n; i=j) 63 { 64 j = i+1; 65 while(j<n&&a[i].x==a[j].x&&a[i].y==a[j].y)//求相同的方向向量 66 { 67 j++; 68 } 69 ans += f(i,j); //求LIS 70 } 71 printf("%d\n",ans); 72 return 0; 73 } View Code

?

K題:Knightsbridge Rises

拆點(diǎn)求最大流問題

思路參考https://blog.csdn.net/V5ZSQ/article/details/80472491

n個(gè)吊車拆成兩排n個(gè)點(diǎn),m個(gè)建筑物看作m個(gè)點(diǎn)

1、源點(diǎn)向所有自身重量為0的吊車連容量為1的邊

2、每個(gè)吊車拆成的第一個(gè)點(diǎn)向第二個(gè)點(diǎn)連容量為1的邊

3、如果Li>=Wj,那么第i個(gè)吊車拆成的第二個(gè)點(diǎn)向第j個(gè)吊車拆成的第一個(gè)點(diǎn)連容量為1的邊

4、如果Li>=Tj,那么第i個(gè)吊車拆成的第二個(gè)點(diǎn)向第j個(gè)建筑物連容量為1的邊

5、每個(gè)建筑物向匯點(diǎn)連容量為1的邊

用最大流是否為m來(lái)判斷是否所有建筑物都可以被吊起,然后再dfs,尋找路徑

代碼參考?https://www.cnblogs.com/clrs97/p/7768748.html

1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=300; 4 const int maxe=4*maxn*maxn; 5 const int inf=0x3f3f3f3f; 6 #define MS(x,y) memset(x,y,sizeof(x)) 7 int head[maxn],tot,n,m; 8 int w[maxe],cap[maxe],nxt[maxe]; 9 void add(int u,int v,int f) //存邊 10 { 11 w[++tot]=v; 12 cap[tot]=f; 13 nxt[tot]=head[u]; 14 head[u]=tot; 15 16 w[++tot]=u; 17 cap[tot]=0; 18 nxt[tot]=head[v]; 19 head[v]=tot; 20 } 21 int d[maxn],ST,ED; 22 bool bfs() 23 { 24 MS(d,-1); 25 queue<int>q; 26 q.push(ST); 27 d[ST]=0; 28 while(!q.empty()) 29 { 30 int u=q.front();q.pop(); 31 for(int i=head[u];i;i=nxt[i]) 32 if(cap[i]) 33 { 34 int v=w[i]; 35 if(d[v]==-1) 36 { 37 d[v]=d[u]+1; 38 q.push(v); 39 if(v==ED) return 1; 40 } 41 42 } 43 } 44 return 0; 45 } 46 int dfs(int x,int all) 47 { 48 if(x==ED) return all; 49 int use=0; 50 for(int i=head[x];i;i=nxt[i]) if(cap[i]) 51 { 52 int y=w[i]; 53 if(d[y]==d[x]+1) 54 { 55 int tmp=dfs(y,min(cap[i],all-use)); 56 cap[i]-=tmp; 57 cap[i^1]+=tmp; 58 use+=tmp; 59 if(use==all) break; 60 } 61 } 62 if(use==0) d[x]=-1; 63 return use; 64 } 65 int dinic() 66 { 67 int ret=0; 68 while(bfs()) ret+=dfs(ST,inf); 69 return ret; 70 } 71 vector<int>vt[maxn]; 72 void dfs_path(int cur,int x) //尋找路徑 73 { 74 for(int i=head[x];i;i=nxt[i]) if((i&1)&&cap[i]) 75 { 76 x=w[i]; 77 break; 78 } 79 if(x==0) return ; 80 vt[cur].push_back(x-n); 81 dfs_path(cur,x-n); 82 } 83 int W[maxn],L[maxn]; 84 int main() 85 { 86 scanf("%d",&n); 87 MS(head,0); 88 tot=1; 89 ST=0; 90 for(int i=1;i<=n;i++) 91 { 92 scanf("%d%d",&W[i],&L[i]); 93 if(W[i]==0) 94 add(ST,i,1); 95 add(i,n+i,1); 96 } 97 for(int i=1;i<=n;i++) 98 { 99 for(int j=1;j<=n;j++) if(i!=j&&L[i]>=W[j]) 100 { 101 add(n+i,j,1); 102 } 103 } 104 scanf("%d",&m); 105 ED=2*n+m+1; 106 int xx; 107 for(int i=1;i<=m;i++) 108 { 109 scanf("%d",&xx); 110 add(2*n+i,ED,1); 111 for(int j=1;j<=n;j++) if(L[j]>=xx) 112 { 113 add(n+j,2*n+i,1); 114 } 115 } 116 if(dinic()==m) 117 { 118 for(int i=head[ED];i;i=nxt[i]) if((i&1)&&cap[i]) 119 { 120 vt[w[i]-2*n].clear(); 121 dfs_path(w[i]-2*n,w[i]); 122 } 123 for(int i=1;i<=m;i++) 124 { 125 for(int j=vt[i].size()-1;j>=0;j--) 126 { 127 if(j!=vt[i].size()-1) printf(" "); 128 printf("%d",vt[i][j]); 129 } 130 printf("\n"); 131 } 132 } 133 else 134 printf("impossible\n"); 135 return 0; 136 137 } View Code

?

轉(zhuǎn)載于:https://www.cnblogs.com/scott527407973/p/9550280.html

總結(jié)

以上是生活随笔為你收集整理的UPC2018组队训练赛第六场的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。