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号小孩得票最高的情况下,所需消耗的最少糖果数。注意:每个人都不能把票投给自己。
代码: