我好菜啊..
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 #include2 #include 3 #include 4 #include 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 }
UVALive 6435
UVALive 6436
UVALive 6437
最小生成树稍微变了下....可是卡了好久...好sb
将必须连接的k个最开始的祖先改成一样


1 #include2 #include 3 #include 4 #include 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 }
UVALive 6438
UVALive 6439
很多人过...可是就是想不出来
补题补题 2016.7.17
我好蠢啊..其实思路是差不多的,就觉得不对,没有去写
就是 碰到一样 的单词 就 ans += 2觉得有点不好写的是 怎么去比较这两个单词一不一样,因为终点不知道
原来 string 是 可以 从左边 加 的...


1 #include2 #include 3 #include 4 #include 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 }
UVALive 6440
UVALive 6441
UVALive 6442
UVALive 6443