Problem A
题意:给你若干字母是你可以分配的, 在给你一个已经放好一些字母的天平。每个字母的重量为一,问你能不能用这些可分配的字母是天平平衡。若有解输出解决方案的任意一种。
思路:直接暴力,先统计左右各有多少,在看一下一共有的字母总数,奇数是不可能平衡的,偶数的话再看左右两边绝对值之差,若大于可分配的字母也是不行的。剩下来把总字母数除二一边输出一半就行了。
代码如下:
1 //2014-01-17-23.27 2 #include3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #define MP(a, b) make_pair(a, b)12 #define PB(a) push_back(a)13 14 using namespace std;15 16 typedef long long ll;17 typedef pair pii;18 typedef pair puu;19 typedef pair pid;20 typedef pair pli;21 22 const int INF = 0x3f3f3f3f;23 const double eps = 1e-6;24 const int LEN = 10100;25 26 int main()27 {28 // freopen("in.txt", "r", stdin);29 30 char str[LEN], buff[LEN];31 int l, r, f, pos;32 while(scanf("%s", str)!=EOF){33 int len = strlen(str);34 l = r = f = 0;35 for(int i=0; i ll || (l+r+ll)%2==1)printf("Impossible\n");43 else{44 int num = (l+r+ll)/2;45 for(int i=0; i
Problem C
题意:有一排卡片卡片上有数字 ,你只能往任意位置插入一张卡片,问你有多少种情况能满足a2 - a1 = a3 - a2 = a4 - a3 = ... = ai + 1 - ai = ... = an - an - 1.
思路:这道题我用了纯if-else流分好多情况讨论(dip为差值):
n<=1 无数种
n=2 差值为非零偶数 三种 num[0]-dip, (num[1]+num[0])/2, num[1]+dip
差值为奇数 两种 num[0]-dip, num[1]+dip
差值为零 一种 num[0]
n>=3 先排序然后看差值有几种大于2 直接输出0
等于2 判断不合法的差值是不是合法的两倍 是 有一种(num[i+1]+num[i])/2
不是 不可能
等于1 dip不为0 两种 num[0]-dip, num[n-1]+dip
否则 一种 num[0]
代码如下:
1 //2014-01-17-23.27 2 #include3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #define MP(a, b) make_pair(a, b)12 #define PB(a) push_back(a)13 14 using namespace std;15 16 typedef long long ll;17 typedef pair pii;18 typedef pair puu;19 typedef pair pid;20 typedef pair pli;21 22 const int INF = 0x3f3f3f3f;23 const double eps = 1e-6;24 const int LEN = 101000;25 26 int main()27 {28 // freopen("in.txt", "r", stdin);29 30 int n, num[LEN], nnum[LEN];31 while(scanf("%d", &n)!=EOF){32 for(int i=0; i nnum[i]){53 if(!el)el = i+1;54 else el = -1;55 }56 }57 if(el==-1 || min(abs(el-0), abs(el-n+1))>1)printf("0\n");58 else if(el == 0){59 int dip = num[1]-num[0];60 if(dip)printf("2\n%d %d\n", num[0]-dip, num[n-1]+dip);61 else printf("1\n%d\n", num[0]);62 }else{63 if(abs(el-n+1)==1)swap(ta,tb);64 if(ta!=2*tb) printf("0\n");65 else{66 printf("1\n");67 for(int i=0; i