2018個人PK賽#5
阿新 • • 發佈:2018-01-20
集合 最大 int turn click cstring == sta codeforce
給n個能源箱,問最後所有能量箱都為一樣的最大值 能量轉移會損失能量 二分 能源的範圍[l-r] 代碼如下:
2018-01-20
A - Cut Ribbon
CodeForces - 189A 兩層循環 代碼如下:#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <stack> #include <queue> typedef long long ll; using namespace std;View Codeconst int MOD=1e9+7; int main() { int n,a,b,c,maxx=0; scanf("%d%d%d%d",&n,&a,&b,&c); for(int i=0;i<=n/a;i++) for(int j=0;j<=n/b;j++) if((n-a*i-b*j)>=0&&(n-a*i-b*j)%c==0) { maxx=max(maxx,i+j+(n-a*i-b*j)/c); } printf("%d\n",maxx); return 0; }
B - s-palindrome
CodeForces - 691B
判斷該字符串是否是鏡像的,模擬 註意‘n’,‘m’並不鏡像
代碼如下:
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <stack> #include <queue> typedefView Codelong long ll; using namespace std; const int MOD=1e9+7; char str[]={‘A‘,‘H‘,‘I‘,‘M‘,‘O‘,‘o‘,‘T‘,‘U‘,‘V‘,‘v‘,‘W‘,‘w‘,‘X‘,‘x‘,‘Y‘}; const int N=1e3+7; char ch[N]; int path(char c) { for(int i=0;i<15;i++) if(c==str[i]) return 1; return 0; } int lp(char c,char d) { if(c==‘d‘&&d==‘b‘) return 1; if(c==‘b‘&&d==‘d‘) return 1; if(c==‘p‘&&d==‘q‘) return 1; if(c==‘q‘&&d==‘p‘) return 1; return 0; } int lk() { int l=0,r=strlen(ch)-1; while(l<=r) { if((ch[l]==ch[r]&&path(ch[l]))||lp(ch[l],ch[r])) { l++;r--; } else return 0; } return 1; } int main() { scanf("%s",ch); if(lk()) puts("TAK"); else puts("NIE"); return 0; }
C - Mahmoud and Ehab and the bipartiteness
CodeForces - 862B 額 題意很重要 就是這個圖的點能否被切分成兩個集合,同一個集合中的點,不能有邊相連。所以最後所有點都會被劃分到兩個集合內。 找出集合的大小m0,m1,邊數就等於m0*m1, 題中有n-1邊是原有的,答案即為m0*m1-(n-1) dfs 代碼如下:#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <map> #include <vector> using namespace std; typedef long long ll; const int N=1e5+7; vector<int>edge[N]; int vis[N]; ll m0=0,m1=0; void dfs(int n,int flag) { if(flag) m0++; else m1++; vis[n]=1; for(int i=0;i<edge[n].size();i++) if(!vis[edge[n][i]]) dfs(edge[n][i],!flag); } int main() { int n,u,v; cin>>n; memset(vis,0,sizeof(vis)); for(int i=0;i<n-1;i++) { cin>>u>>v; edge[u].push_back(v); edge[v].push_back(u); } dfs(1,0); cout<<m0*m1-(n-1)<<endl; return 0; }View Code
D - Dasha and Very Difficult Problem
CodeForces - 761D 題意: 已知a序列,以及c序列的大小的排名, c[i]=b[i]-a[i],且a[i],b[i]均是[l-r]範圍內,求b序列,若不存在輸出-1 操作順序是從c序列的小到大,首先找到一個最小值 minn=(l-a[vis[0]]),然後下一個數為minn+1 ,b[i]=minn+1+a[i],若b[i]不在[l-r]範圍內結束,輸出-1 ,否則 b[i]=max(b[i],l) 繼續操作 代碼如下:#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <stack> #include <queue> using namespace std; typedef long long ll; const int N=1e5+7; const int INF=1e9+7; int a[N],b[N]; int vis[N]; int main() { int n,l,r,p; scanf("%d%d%d",&n,&l,&r); for(int i=0;i<n;i++) scanf("%d",&a[i]); for(int i=0;i<n;i++) { scanf("%d",&p); vis[p-1]=i; } int minn=-INF,flag=0; for(int i=0;i<n;i++) { if(i==0) { b[vis[i]]=l; minn=l-a[vis[i]]; } else { int x=minn+1+a[vis[i]]; if(x>r) { flag=1; break; } else b[vis[i]]=max(l,x); minn=b[vis[i]]-a[vis[i]]; } } if(flag) puts("-1"); else { for(int i=0;i<n;i++) printf("%d%c",b[i],i==n-1?‘\n‘:‘ ‘); } return 0; }View Code
E - Energy exchange
CodeForces - 68B 題意:給n個能源箱,問最後所有能量箱都為一樣的最大值 能量轉移會損失能量 二分 能源的範圍[l-r] 代碼如下:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int N=1e4+7; int main() { double l=1000,r=0; int n,k; double a[N]; scanf("%d%d",&n,&k); for(int i=0;i<n;i++) { scanf("%lf",&a[i]); l=min(l,a[i]); r=max(r,a[i]); } while(l+1e-9<=r) { double mid=(l+r)*1.0/2.0; double ans=0; for(int i=0;i<n;i++) { if(a[i]>mid) { ans+=mid; ans+=(a[i]-mid)*(100-k)*1.0/100.0; } else ans+=a[i]; } if(ans>n*mid) l=mid; else r=mid; } printf("%.9lf\n",l); return 0; }View Code
2018個人PK賽#5