佳木斯集训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 }
View Code

 

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

 

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

 

posted @ 2019-08-06 15:23  落筱  阅读(171)  评论(2编辑  收藏  举报