The 10th Zhejiang Provincial Collegiate Programming Contest (部分)

B:Break Standard Weight    ZOJ   3706
题目大意:每个案例给出一个x和一个y。x和y你只能分解其中的一个,将一个数分解为两个数,然后用这三个数可以得到更多的数。问怎样分解可以使能使得到的数最多。
思路:暴力   这些数的组合最多有13种情况,可以对这些情况直接暴力判断
代码:
 

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
set<int>s;
int maxn;
int m,p,x,y;
int solve(int x,int y){
    for(int i=1;i<=x/2;++i){
        int m=i;int p=x-i;
        s.insert(m); s.insert(p); s.insert(x); s.insert(y);
        if(x-y) s.insert(abs(x-y));
        s.insert(x+y);
        if(y-p) s.insert(abs(y-p));
        s.insert(y+p);
        if(y-m) s.insert(abs(y-m));
         s.insert(y+m);
        if(p-m) s.insert(abs(p-m));
        if(y-p+m) s.insert(abs(y-p+m));
        if(y+p-m) s.insert(abs(y+p-m));
        if(maxn<s.size())maxn=s.size();
        s.clear();
    }
    return maxn;
}
int main(){
    int T;
    while(scanf("%d",&T)!=EOF){
        while(T--){
            maxn=0;
            scanf("%d%d",&x,&y);
            solve(x,y);//分解x,分解y这两种情况都要判断
            solve(y,x);
            cout<<maxn<<endl;
        }
    }
    return 0;
}

D: Density of Power Network   ZOJ  3708
题目大意:n表示有n个点,m表示有m条边,边是无向边, 给出的边中可能存在平行边,问去除平行边后的边数与点数的比值是多少
代码:
 

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int maxn = 505;

int test;
bool dp[maxn][maxn];
int n, m;
int xx[maxn], yy[maxn];

int main() {
    scanf("%d", &test);
    while(test--) {
        scanf("%d%d", &n, &m);
        memset(dp, false, sizeof(dp));
        int temp = m;
        for(int i = 0; i < m; i++) 
            scanf("%d", &xx[i]);
        for(int i = 0; i < m; i++) 
            scanf("%d", &yy[i]);
        for(int i = 0; i < m; i++) {
            if(!dp[xx[i]][yy[i]]) {
                dp[xx[i]][yy[i]] = true;
                dp[yy[i]][xx[i]] = true;
            } else {
                temp--;
            }
        }
        double ans = (temp * 1.0) / n;
        printf("%.3lf\n", ans);
    }
    return 0;
} 

I:In 7-bit    ZOJ  3713      转载来源    用  printf("%02X", k)  可以直接输出16进制。
题目大意:给定一个字符串,按照十六进制输出,但是对于字符串的长度的输出比较麻烦,首先是将长度len转换成二进制,取后七位,如果除去后七位前边还有1那么就在第八位位置加上1,然后将len右移7位,继续上述步骤,例如10001000100,那么第一次取出来的后七位就是1000100,因为前边还有1,所以第一次取出来的变为11000100,然后将len右移7位得到1000,依次输出他们的十六进制就可以了。
代码:
 

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char a[3000005];
int main(){
    int t;
    while(scanf("%d",&t)!=EOF){
        getchar();
        while(t--){
            gets(a);
            int len=strlen(a);
            int h=len;
            if(len==0)
                printf("00\n");
            else{
                while(h){
                    int sum=h%128;//最后7位的数字是多少
                    h/=128;
                    if(h)
                        sum+=128;//如果还有长度就加上128
                    printf("%02X",sum);//%X是16进制,02x代表2位,不够左面补0
                }
                for(int i=0; i<len; i++)
                    printf("%02X",a[i]);
                printf("\n");
            }
        }
    }
    return 0;
}

 J:Java Beans   ZOJ  3714
题目大意:给定 n,m两个数值。n表示有n个数,m表示在这n个数中,可以有连续m个数进行加和。问最后最大的结果是多少。注意:这n个数是首尾相连的(即是一个圈),以为着最后方的值也可以与最前方的值进行相加。
代码如下:
 

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int a[2100];
int b[2100];
int main(){
    int T;
    int m,n;
    while(scanf("%d",&T)!=EOF){
        while(T--){
            scanf("%d%d",&n,&m);
            for(int i=1;i<=n;i++)
                scanf("%d",&a[i]);
                int sum = 0;
                int ans = -0x3f3f3f3f;
            for(int i=1;i<=n-m+1;i++) {
                sum = 0;
                for(int j=i;j<i+m;j++)
                    sum+=a[j];

                ans = max(sum,ans);
            }
            for(int i=n-m+2;i<=n;i++) {
                sum = 0;
                for(int j=i;j<=n;j++)
                    sum+=a[j];

                for(int j=1;j<m-n+i;j++)
                    sum+=a[j];
                 ans = max(sum,ans);
            }
            cout << ans << endl;
        }
    }
    return 0;
}

K:Kindergarten Election    ZOJ  3715
题目大意:n个小孩竞选班长,谁票数高,谁是班长,1号小孩,特别想担任班长,所以他准备用糖果收买那些不准备把票投给自己的小孩。每个案例第一行为n,代表小孩数,第二行的n-1个数,代表对应编号的小孩的好朋友的编号,他要把票投给自己的好朋友,第三行的n-1个数,代表收买每个小孩,所需要的糖果数量。问在保证1号小孩得票最高的情况下,所需消耗的最少糖果数。注意:每个人都不能把票投给自己。
代码:
 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值