UESTC 2016 Summer Training #6 Div.2

我好菜啊..

UVALive 6434

给出 n 个数,分成m组,每组的价值为最大值减去最小值,每组至少有1个,如果这一组只有一个数的话,价值为0

问 最小的价值是多少

dp[i][j] 表示将 前 i 个数分成 j 组的最小价值

dp[i][j] = min(dp[k][j-1] + a[i]-a[k+1])

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 typedef long long LL;
 7 const int INF = (1<<30)-1;
 8 int n,m,a[105];
 9 LL dp[105][105];
10 
11 void solve(){
12     for(int i = 1;i <= n;i++)
13         for(int j = 1;j <= m;j++) dp[i][j] = INF;
14 
15     sort(a+1,a+n+1);
16     for(int i = 1;i <= n;i++){
17         dp[i][1] = 1LL*(a[i]-a[1]);
18         for(int j = 2;j <= m;j++){
19             for(int k = 1;k < i;k++){
20                 dp[i][j] = min(dp[i][j],dp[k][j-1]+1LL*(a[i]-a[k+1]));
21                 //printf("dp[%d][%d] = %d\n",i,j,dp[i][j]);
22             }
23         }
24     }
25     printf("%lld\n",dp[n][m]);
26 }
27 
28 int main(){
29     int T,kase = 0;
30     scanf("%d",&T);
31     while(T--){
32         scanf("%d %d",&n,&m);
33         for(int i = 1;i <= n;i++) scanf("%d",a+i);
34         printf("Case #%d: ",++kase);
35         solve();
36     }
37     return 0;
38 }
View Code

 

 

UVALive 6435

 

UVALive 6436

 

UVALive 6437

最小生成树稍微变了下....可是卡了好久...好sb

将必须连接的k个最开始的祖先改成一样

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 const int maxn = 205;
 7 int n,m,k,a[205],fa[205],b[205];
 8 
 9 struct Edge{
10     int u,v,w,tag;
11     friend bool operator < (Edge a,Edge b){
12          return a.w < b.w;
13     }
14 }e[maxn*maxn];
15 
16 int Find(int x){return x == fa[x] ? x :fa[x] = Find(fa[x]);}
17 
18 void solve(){
19     sort(e+1,e+m+1);
20     for(int i = 1;i <= n;i++) fa[i] = i;
21     for(int i = 1;i <= k;i++) fa[a[i]] = a[1];
22     int tot = 0,cc = n;
23     for(int i = 1;i <= m;i++){
24         int u = e[i].u;
25         int v = e[i].v;
26         int x = Find(u);
27         int y = Find(v);
28         if(x != y){
29             fa[x] = y;
30             tot += e[i].w;
31         }
32     }
33     printf("%d\n",tot);
34 }
35 
36 
37 int main(){
38     int T,kase = 0;
39     scanf("%d",&T);
40     while(T--){
41         scanf("%d %d %d",&n,&m,&k);
42         memset(b,0,sizeof(b));
43         for(int i = 1;i <= k;i++) {
44             scanf("%d",a+i);
45         }
46         for(int i = 1;i <= m;i++){
47             scanf("%d %d %d",&e[i].u,&e[i].v,&e[i].w);
48         }
49         printf("Case #%d: ",++kase);
50         solve();
51     }
52     return 0;
53 }
View Code

 

 

UVALive 6438

 

UVALive 6439

很多人过...可是就是想不出来

补题补题 2016.7.17

我好蠢啊..其实思路是差不多的,就觉得不对,没有去写

就是 碰到一样 的单词 就 ans += 2觉得有点不好写的是 怎么去比较这两个单词一不一样,因为终点不知道

原来 string 是 可以 从左边 加 的...

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 string s;
 7 
 8 void solve(){
 9     string l,r;
10     int len = s.length(),ans = 0;
11     for(int i = 0;2*i < len;i++){
12         l += s[i];
13         if(i == len-i-1) continue;
14         r = s[len-i-1]+r;
15         //cout << l << " " << r << "\n";
16         if(l == r){
17             ans+= 2;
18             l.clear();r.clear();
19         }
20     }
21     if(l.length() != 0 || r.length() != 0) ans++;
22     printf("%d\n",ans);
23 }
24 
25 int main(){
26     int T,kase = 0;
27     scanf("%d",&T);
28     while(T--){
29         cin >> s;
30         printf("Case #%d: ",++kase);
31         solve();
32     }
33     return 0;
34 }
View Code

 

 

 

UVALive 6440

 

UVALive 6441

 

UVALive 6442

 

UVALive 6443

 

转载于:https://www.cnblogs.com/wuyuewoniu/p/5677038.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值