Problem A Ksenia and Pan Scales
题意:给你若干字母是你可以分配的, 在给你一个已经放好一些字母的天平。每个字母的重量为一,问你能不能用这些可分配的字母是天平平衡。若有解输出解决方案的任意一种。
思路:直接暴力,先统计左右各有多少,在看一下一共有的字母总数,奇数是不可能平衡的,偶数的话再看左右两边绝对值之差,若大于可分配的字母也是不行的。剩下来把总字母数除二一边输出一半就行了。
代码如下:
1 //2014-01-17-23.27 2 #include <iostream> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <cmath> 6 #include <cstring> 7 #include <algorithm> 8 #include <queue> 9 #include <stack> 10 #include <vector> 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<int ,int> pii; 18 typedef pair<unsigned int, unsigned int> puu; 19 typedef pair<int ,double> pid; 20 typedef pair<ll, int> 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<len; i++){ 36 if(str[i]=='|'){ f = 1;pos = i;continue;} 37 if(f==0)l++; 38 if(f==1)r++; 39 } 40 scanf("%s", buff); 41 int ll = strlen(buff); 42 if(abs(l-r)>ll || (l+r+ll)%2==1)printf("Impossible "); 43 else{ 44 int num = (l+r+ll)/2; 45 for(int i=0; i<pos; i++)putchar(str[i]); 46 if(l==num)putchar('|'); 47 for(int i=0; i<ll; i++){ 48 putchar(buff[i]); 49 if(i==(num-l-1))putchar('|'); 50 } 51 for(int i=pos+1; i<len; i++)putchar(str[i]); 52 putchar(' '); 53 } 54 } 55 return 0; 56 }
Problem C Arithmetic Progression
题意:有一排卡片卡片上有数字 ,你只能往任意位置插入一张卡片,问你有多少种情况能满足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 #include <iostream> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <cmath> 6 #include <cstring> 7 #include <algorithm> 8 #include <queue> 9 #include <stack> 10 #include <vector> 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<int ,int> pii; 18 typedef pair<unsigned int, unsigned int> puu; 19 typedef pair<int ,double> pid; 20 typedef pair<ll, int> 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<n; i++)scanf("%d", &num[i]); 33 sort(num, num+n); 34 if(n<=1)printf("-1 "); 35 else if(n==2){ 36 int dip = (num[1]-num[0]); 37 if(dip%2==0 && dip){ 38 printf("3 %d %d %d ", num[0]-dip, (num[1]+num[0])/2, num[1]+dip); 39 }else{ 40 if(dip!=0)printf("2 %d %d ", num[0]-dip, num[1]+dip); 41 else printf("1 %d ", num[0]); 42 } 43 } 44 else{ 45 int el = 0, ta = -1, tb = -1; 46 for(int i=0; i<n-1; i++) nnum[i] = num[i+1]-num[i]; 47 sort(nnum, nnum+n-1); 48 // for(int i=0; i<n-1; i++)cout << nnum[i] << ' '; cout << endl; 49 for(int i=0; i<n-1; i++) { 50 if(ta==-1)ta = nnum[i]; 51 if(ta!=-1 && nnum[i]!=ta)tb = nnum[i]; 52 if(nnum[i+1]>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 "); 58 else if(el == 0){ 59 int dip = num[1]-num[0]; 60 if(dip)printf("2 %d %d ", num[0]-dip, num[n-1]+dip); 61 else printf("1 %d ", num[0]); 62 }else{ 63 if(abs(el-n+1)==1)swap(ta,tb); 64 if(ta!=2*tb) printf("0 "); 65 else{ 66 printf("1 "); 67 for(int i=0; i<n-1; i++){ 68 if(num[i+1]-num[i]==ta){ 69 printf("%d ", (num[i+1]+num[i])/2); 70 break; 71 } 72 } 73 } 74 } 75 } 76 } 77 return 0; 78 }