佳木斯集训Day8
本来能AK的啊啊啊啊啊,唯一一天可以AK,却被Champion误导了(好吧实际上是我理解有问题)
T1我写了俩小时,就是一道数列题,推公式的,可以二分解,我觉得二分麻烦,就直接想O(1)了
1 #include <bits/stdc++.h> 2 #define db double 3 #define MAXN 5050 4 #define ll long long 5 int n; 6 db a[MAXN],d[MAXN],sum,ans,gou; 7 using namespace std; 8 int main() 9 { 10 cin>>n; 11 cin>>a[0]; 12 cin>>sum; 13 sum+=a[0]*n; 14 for(int i=1;i<=n;i++) 15 { 16 cin>>d[i]; 17 sum-=2*d[i]*(n+1-i); 18 } 19 printf("%0.2f\n",sum/(n+1)); 20 return 0; 21 }
T2简单啊...田忌赛马,直接一个DP完事儿了,不知道为什么好多人wa10,据说是贪心的锅,这道题贪心应该也可过,不过需要双指针
1 #include <bits/stdc++.h> 2 #define ll long long 3 #define MAXN 1050 4 using namespace std; 5 int n,t,ans; 6 int a[MAXN],b[MAXN],dp[MAXN][MAXN],f[MAXN][MAXN]; 7 bool cmp(int a,int b) 8 { 9 return a>b; 10 } 11 int main() 12 { 13 cin>>t; 14 while(t--) 15 { 16 int maxn=0; 17 int minx=50000; 18 int bigg=0; 19 int smalll=0,ii,jj; 20 cin>>n; 21 for(int i=1;i<=n;i++) 22 { 23 cin>>a[i]; 24 minx=min(minx,a[i]); 25 } 26 for(int i=1;i<=n;i++) 27 { 28 cin>>b[i]; 29 maxn=max(maxn,b[i]); 30 } 31 /*if(minx>=maxn) 32 { 33 if(minx==maxn) 34 cout<<(n-1)*200; 35 else 36 cout<<n*200; 37 continue; 38 }*/ 39 sort(a+1,a+1+n,cmp); 40 sort(b+1,b+1+n,cmp); 41 for(register int i=1;i<=n;i++) 42 { 43 for(register int j=1;j<=n;j++) 44 { 45 if(a[i]>b[j]) 46 dp[i][j]=200; 47 else if(a[i]==b[j]) 48 dp[i][j]=0; 49 else 50 dp[i][j]=-200; 51 } 52 } 53 for (int i=1;i<=n;i++) 54 { 55 f[i][0]=f[i-1][0]+dp[n-i+1][i]; 56 f[i][i]=f[i-1][i-1]+dp[i][i]; 57 for(int j=1;j<i;++j) 58 { 59 f[i][j]=max(f[i-1][j]+dp[n-i+j+1][i],f[i-1][j-1]+dp[j][i]); 60 } 61 } 62 // for(int i=1;i<=n;i++) 63 // cout<<f[i][1]<<" "; 64 int sum=f[n][1]; 65 for(int i=2;i<=n;++i) 66 sum=max(sum,f[n][i]); 67 printf("%d\n",sum); 68 } 69 return 0; 70 }
T3裸的Tree DP,最后结果gcd一下就好了,啊啊啊啊啊我没有gcd结果wa0....
1 #include <bits/stdc++.h> 2 #define MAXN 1080 3 using namespace std; 4 bool vis[805022]; 5 int spfa[805000],dp[100080][3]; 6 int n,m,k,nw,ny,ans,pos,l,r,num,top,maxn; 7 int head[800000]; 8 queue <int>q; 9 struct Node{ 10 int to,nxt,dis; 11 }g[800000]; 12 void add(int u,int v,int dis) 13 { 14 g[++top].to=v; 15 g[top].nxt=head[u]; 16 g[top].dis=dis; 17 head[u]=top; 18 } 19 int work(int a) 20 { 21 return (a%3+3)%3; 22 } 23 void dfs(int u,int fa)//父亲和当前的节点 24 { 25 dp[u][0]=1; 26 for(int i=head[u];i;i=g[i].nxt) 27 { 28 int v=g[i].to; 29 if(v==fa) 30 continue; 31 dfs(v,u); 32 for(int j=0;j<3;j++) 33 { 34 ans+=dp[v][j]*dp[u][work(-j-g[i].dis)]*2; 35 } 36 for(int j=0;j<3;j++) 37 dp[u][work(j+g[i].dis)]+=dp[v][j]; 38 } 39 } 40 int main() 41 { 42 cin>>n; 43 for(int i=1;i<=n-1;i++) 44 { 45 int x,y,z; 46 cin>>x>>y>>z; 47 add(x,y,z); 48 add(y,x,z); 49 } 50 dfs(1,-1); 51 ans+=n; 52 maxn=n*n; 53 int g=__gcd(ans,maxn); 54 cout<<ans/g<<"/"<<maxn/g<<endl; 55 }