20130827组队赛Regionals 2012, North America - Greater NY
来源:互联网 发布:2178手游充值库存软件 编辑:程序博客网 时间:2024/05/16 17:16
今天的题目我以前竟然看过,这.....
A. Hailstone HOTPO
水题啊,都做过了,还是没有抢到FB啊,太水了,手速手速;就按照题目给的变换一直变化,一直更新最大值,当找到
1的时候输出最大值就可以了:
#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <map>#include <vector>#include <cstdlib>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>#include <functional>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cassert>#include <bitset>#include <stack>#include <ctime>#include <list>#define INF 0x7fffffff#define max3(a,b,c) (max(a,b)>c?max(a,b):c)#define min3(a,b,c) (min(a,b)<c?min(a,b):c)#define mem(a,b) memset(a,b,sizeof(a))using namespace std;int gcd(int n,int m){ if(n<m) swap(n,m); return n%m==0?m:gcd(m,n%m);}int lcm(int n,int m){ if(n<m) swap(n,m); return n/gcd(n,m)*m;}#define N 10000007int prime[N];struct node{ int x, y;};bool cmp(const node & a, const node & b){ return a.x > b.x;}void getPrime();void bash();void wzf();void SG();int QuickMod(int a, int b, int n);int MAX;int t;int index, num;int main(){ scanf("%d", &t); while(t--) { scanf("%d%d", &index, &num); printf("%d ", index); MAX = num; while(1) { if(num == 1) { printf("%d\n", MAX); break; } if(num%2 == 0) { num /= 2; if(num > MAX) MAX = num; } else { num = 3*num +1; if(num > MAX) MAX = num; } } } return 0;}int QuickMod(int a,int b,int n){ int r = 1; while(b) { if(b&1) r = (r*a)%n; a = (a*a)%n; b >>= 1; } return r;}void getPrime(){ memset(prime, 0, sizeof(prime)); prime[0] = 1; prime[1] = 1; for(int i = 2; i < N; ++i) { if(prime[i] == 0) { for(int j = i+i; j < N; j+=i) prime[j] = 1; } }}void bash(int n, int m){ if(n%(m+1) != 0) printf("1\n"); else printf("0\n");}void wzf(int n, int m){ if(n > m) swap(n, m); int k = m-n; int a = (k * (1.0 + sqrt(5.0))/2.0); if(a == n) printf("0\n"); else printf("1\n");}int numsg[N];void SG(int n){ int sum = 0; for(int i=0; i < n; i++) { scanf("%d",&numsg[i]); sum ^= numsg[i]; } if(sum == 0) printf("No\n"); else { printf("Yes\n"); for(int i = 0; i < n; i++) { int s = sum ^ numsg[i]; if(s < numsg[i]) printf("%d %d\n", numsg[i], s);//从有num[i]个石子的堆后剩余s个石子 } }}
B. B-Casting
题目的意思是给出一个A进制的数字B,对于A减一取余,求最后的值是多少(十进制)?
这样我们就对于输入的A进制的数字B,因为B的长度会达到10,000,000.的长度,所以我们不能按照一般的方法,把A进制
的数字B转成十进制再对A-1取模;对于一个A进制的数,假设每一位分别是an....a2,a1,a0;则变成十进制就是
(1*a0)+(A*a1)+......((A^n)*an);对于其中的一项 求(A^k *ak )%(A-1)用t = A-1则变成((t+1)^k*ak)%t而(t+1)
^k%t展开(比如(4*4*4*4)%3 == (4%3)*(4%3) * (4%3) * (4%3) == 1)后只剩1了,其他都是t的倍数所以(b^k
*ak )%(b-1)=ak%(b-1);所以就对于数字B的每一位对A-1取模就可以了:
#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <map>#include <vector>#include <cstdlib>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>#include <functional>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cassert>#include <bitset>#include <stack>#include <ctime>#include <list>#define INF 0x7fffffff#define max3(a,b,c) (max(a,b)>c?max(a,b):c)#define min3(a,b,c) (min(a,b)<c?min(a,b):c)#define mem(a,b) memset(a,b,sizeof(a))using namespace std;int gcd(int n,int m){ if(n<m) swap(n,m); return n%m==0?m:gcd(m,n%m);}int lcm(int n,int m){ if(n<m) swap(n,m); return n/gcd(n,m)*m;}#define N 10000007int prime[N];struct node{ int x, y;};bool cmp(const node & a, const node & b){ return a.x > b.x;}void getPrime();void bash();void wzf();void SG();int QuickMod(int a, int b, int n);char s[10000005];int main(){ int i, j; int n, x, t; __int64 sum; scanf("%d", &n); while(n--) { scanf("%d%d%s",&t, &x, s); j = strlen(s); for(i = 0, sum = 0; i < j; ++i) sum = (sum * x + s[i]-'0')%(x-1); printf("%d %I64d\n", t, sum); } return 0;}int QuickMod(int a,int b,int n){ int r = 1; while(b) { if(b&1) r = (r*a)%n; a = (a*a)%n; b >>= 1; } return r;}void getPrime(){ memset(prime, 0, sizeof(prime)); prime[0] = 1; prime[1] = 1; for(int i = 2; i < N; ++i) { if(prime[i] == 0) { for(int j = i+i; j < N; j+=i) prime[j] = 1; } }}void bash(int n, int m){ if(n%(m+1) != 0) printf("1\n"); else printf("0\n");}void wzf(int n, int m){ if(n > m) swap(n, m); int k = m-n; int a = (k * (1.0 + sqrt(5.0))/2.0); if(a == n) printf("0\n"); else printf("1\n");}int numsg[N];void SG(int n){ int sum = 0; for(int i=0; i < n; i++) { scanf("%d",&numsg[i]); sum ^= numsg[i]; } if(sum == 0) printf("No\n"); else { printf("Yes\n"); for(int i = 0; i < n; i++) { int s = sum ^ numsg[i]; if(s < numsg[i]) printf("%d %d\n", numsg[i], s);//从有num[i]个石子的堆后剩余s个石子 } }}
C. Pen Counts
这道题目的意思就是给出你一个三角形的周长n,然后问你这样的三角形个数有多少个,如果三边不相等则再加一
假设三角形边长为x,y,z,已知z,则有x+y=n-z,x-y<z,令x-y=t,(0<=t<z),求解得 x=(n-z+t)/2,y=
(n-z-t)/2,对于y,ymax=(n-z)/2,ymin=(n-z-(z-1))/2.
#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <map>#include <vector>#include <cstdlib>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>#include <functional>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cassert>#include <bitset>#include <stack>#include <ctime>#include <list>#define INF 0x7fffffff#define max3(a,b,c) (max(a,b)>c?max(a,b):c)#define min3(a,b,c) (min(a,b)<c?min(a,b):c)#define mem(a,b) memset(a,b,sizeof(a))using namespace std;long long gcd(long long n,long long m){ if(n<m) swap(n,m); return n%m==0?m:gcd(m,n%m);}long long lcm(long long n,long long m){ if(n<m) swap(n,m); return n/gcd(n,m)*m;}#define N 10000007int prime[N];struct node{ int x, y;};bool cmp(const node & a, const node & b){ return a.x > b.x;}void getPrime();void bash();void wzf();void SG();int QuickMod(int a, int b, int n);int main(){ int num; int n; int t; int ans; scanf("%d", &t); while(t--) { scanf("%d%d", &num, &n); ans = 0; for(int z = 1; z <= n/3; ++z) { int temp = 0; int x = (n-z)/2; int j = max(z, n/2-z+1); if(x+z <= n-z-x || x > n-z-x) continue; if(j == z) { temp = z; ans--; } if(temp != x && x == n-z-x) ans--; ans += (x-j+1)*2; } printf("%d %d\n", num, ans); } return 0;}int QuickMod(int a,int b,int n){ int r = 1; while(b) { if(b&1) r = (r*a)%n; a = (a*a)%n; b >>= 1; } return r;}void getPrime(){ memset(prime, 0, sizeof(prime)); prime[0] = 1; prime[1] = 1; for(int i = 2; i < N; ++i) { if(prime[i] == 0) { for(int j = i+i; j < N; j+=i) prime[j] = 1; } }}void bash(int n, int m){ if(n%(m+1) != 0) printf("1\n"); else printf("0\n");}void wzf(int n, int m){ if(n > m) swap(n, m); int k = m-n; int a = (k * (1.0 + sqrt(5.0))/2.0); if(a == n) printf("0\n"); else printf("1\n");}int numsg[N];void SG(int n){ int sum = 0; for(int i=0; i < n; i++) { scanf("%d",&numsg[i]); sum ^= numsg[i]; } if(sum == 0) printf("No\n"); else { printf("Yes\n"); for(int i = 0; i < n; i++) { int s = sum ^ numsg[i]; if(s < numsg[i]) printf("%d %d\n", numsg[i], s);//从有num[i]个石子的堆后剩余s个石子 } }}
昨天在BNU上交的那个在HDU上TLE了:
#include<iostream>#include<cstdio>#include<vector>#include<string>#include<queue>#include<cmath>#include<algorithm>#include<cstring>#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define maxn 10005#define INF 0xfffffff#define mem(a,b) memset(a,b,sizeof(a))#define FOR(i,s,t) for(int i=s;i<=t;i++)#define ull unsigned long long#define ll long longusing namespace std;int main(){ int p,n,num; scanf("%d",&p); for(int i=1;i<=p;i++) { int ans=0; scanf("%d%d",&num,&n); for(int c=n/3;2*c<n;c++) { for(int a=1;a<=(n-c)/2;a++) { int b=n-a-c; if(a<=b&&b<=c&&a<=c&&a+b>c)//&&f(a,b,c)) { ans++; if(a!=b&&b!=c&&a!=c) ans++; } } } printf("%d %d\n",num,ans); } return 0;}
E. Faulhaber's Triangle
这道题目不是特别难,就是麻烦,由于是400*400的格子,可以直接根据题目给出的公式构建出这个表格,由num[i][j]可以推出num[i+1][j+1],可以先求出第二列到后面的值,然后再用1减掉就是第一个数字了。(昨天是用结构体存储分子和分母的,我用了一个三位数组来保存)唉,RE了三次,一直以为是除0的问题,改了好多,还是不行,最后竟然是数组开小了,这.....
#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <map>#include <vector>#include <cstdlib>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>#include <functional>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cassert>#include <bitset>#include <stack>#include <ctime>#include <list>#define INF 0x7fffffff#define max3(a,b,c) (max(a,b)>c?max(a,b):c)#define min3(a,b,c) (min(a,b)<c?min(a,b):c)#define mem(a,b) memset(a,b,sizeof(a))using namespace std;int t;int no;int x, y;long long num[403][403][2];long long gcd(long long n,long long m){ if(m == 0) return n; return gcd(m, n%m);}long long lcm(long long n, long long m){ return (n*m)/gcd(n,m);}void init(){ num[0][1][0] = 1; num[0][1][1] = 1; long long sumlcm, sumgcd; for(int i = 1; i < 403; ++i) { sumlcm = 1; sumgcd = 1; for(int j = 2; j <= i+1; ++j) { if(num[i-1][j-1][0] == 0) { num[i][j][0] = 0; num[i][j][1] = 1; } else { num[i][j][0] = num[i-1][j-1][0] * i; num[i][j][1] = num[i-1][j-1][1] * j; long long gg = gcd(num[i][j][0], num[i][j][1]); num[i][j][0] /= gg; num[i][j][1] /= gg; sumlcm = lcm(sumlcm, num[i][j][1]); } } long long tmp = sumlcm; for(int k = 2; k <= i+1; ++k) { tmp -= num[i][k][0]*(sumlcm/num[i][k][1]); } num[i][1][0] = tmp; num[i][1][1] = sumlcm; long long pp = gcd(num[i][1][0], num[i][1][1]); num[i][1][1] /= pp; num[i][1][0] /= pp; }}int main(){ init(); scanf("%d", &t); while(t--) { scanf("%d%d%d", &no, &x, &y); printf("%d " , no); if(num[x][y][0] < 0 && num[x][y][1] < 0) { num[x][y][0] *= -1; num[x][y][1] *= -1; } else if(num[x][y][0] < 0 && num[x][y][1] > 0) { printf("-"); num[x][y][0] *= -1; } else if(num[x][y][0] > 0 && num[x][y][1] < 0) { printf("-"); num[x][y][1] *= -1; } printf("%lld", num[x][y][0]); if(num[x][y][1] != 1) { printf("/%lld\n", num[x][y][1]); } else printf("\n"); } return 0;}
J. Mystery
蛋疼的样例啊,对着代码改了半天,就是手动输入MAC可以,复制就不可以了,纠结了半天,木有问题啊,后来他们
才说是给的样例的后面都加了一个空格,所以一直不对,唉,直接交,CE了 ,跪,不明白了index在哪个函数里面用
到了,好奇葩,%*c还是用的不好啊,改了index猜过,这...这道题目就是给你一个字符串,在给出n个数字,分别输
出每次求和的原字符串中的字符,为避免负数的情况,每次都对当前数字加上字符串长度并对Len取模,这样照着输
出就可以了,给样例跪....
#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <map>#include <vector>#include <cstdlib>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>#include <functional>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cassert>#include <bitset>#include <stack>#include <ctime>#include <list>#define INF 0x7fffffff#define max3(a,b,c) (max(a,b)>c?max(a,b):c)#define min3(a,b,c) (min(a,b)<c?min(a,b):c)#define mem(a,b) memset(a,b,sizeof(a))using namespace std;int gcd(int n,int m){ if(n<m) swap(n,m); return n%m==0?m:gcd(m,n%m);}int lcm(int n,int m){ if(n<m) swap(n,m); return n/gcd(n,m)*m;}#define N 10000007int prime[N];struct node{ int x, y;};bool cmp(const node & a, const node & b){ return a.x > b.x;}void getPrime();void bash();void wzf();void SG();int QuickMod(int a, int b, int n);int t, n;int index;int num;int main(){ scanf("%d", &t); while(t--) { //mem(str, 0); scanf("%d%*c", &index); char str[1000]; gets(str); scanf("%d", &n); int len = strlen(str); int sum = 0; printf("%d ", index); while(n--) { scanf("%d", &num); sum += num; sum = (sum + len)%len; printf("%c", str[sum]); } puts(""); } return 0;}int QuickMod(int a,int b,int n){ int r = 1; while(b) { if(b&1) r = (r*a)%n; a = (a*a)%n; b >>= 1; } return r;}void getPrime(){ memset(prime, 0, sizeof(prime)); prime[0] = 1; prime[1] = 1; for(int i = 2; i < N; ++i) { if(prime[i] == 0) { for(int j = i+i; j < N; j+=i) prime[j] = 1; } }}void bash(int n, int m){ if(n%(m+1) != 0) printf("1\n"); else printf("0\n");}void wzf(int n, int m){ if(n > m) swap(n, m); int k = m-n; int a = (k * (1.0 + sqrt(5.0))/2.0); if(a == n) printf("0\n"); else printf("1\n");}int numsg[N];void SG(int n){ int sum = 0; for(int i=0; i < n; i++) { scanf("%d",&numsg[i]); sum ^= numsg[i]; } if(sum == 0) printf("No\n"); else { printf("Yes\n"); for(int i = 0; i < n; i++) { int s = sum ^ numsg[i]; if(s < numsg[i]) printf("%d %d\n", numsg[i], s);//从有num[i]个石子的堆后剩余s个石子 } }}
下面属于转帖:
D:dp递推,神奇...
#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <map>#include <vector>#include <cstdlib>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>#include <functional>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cassert>#include <bitset>#include <stack>#include <ctime>#include <list>#define INF 0x7fffffff#define max3(a,b,c) (max(a,b)>c?max(a,b):c)#define min3(a,b,c) (min(a,b)<c?min(a,b):c)#define mem(a,b) memset(a,b,sizeof(a))using namespace std;int t, cnt, n;double l, r, ans;double dp[1005][1005];int main(){ scanf("%d", &t); while(t--) { scanf("%d%d%lf%lf", &cnt, &n, &l, &r); dp[0][0]=1; for(int i = 1; i <= n; i++) { dp[i][0] = dp[i-1][0]*(1-r) + dp[i-1][1]*l; for(int j = 1; j <= n; j++) dp[i][j] = dp[i-1][j-1]*r + dp[i-1][j+1]*l + dp[i-1][j]*(1-l-r); } ans = 0; for(int i = 1; i <= n; i++) ans += (double)i*dp[n][i]; printf("%d %.4f\n",cnt,ans); } return 0;}
F. The King's Ups and Downs
题目大意:给你n个人,身高依次是1~n让你求高低高。。。或者低高低。。这样的方案数。
解题思路:高中的时候,好像做过一些此类的题目。需要递推,讲一下大概思路。实际上真的不麻烦。已知前面1~n-1的方案数,然后算第n个。从n-1里面选i个排好序的放在n的前面,选择的方法组合数为C(n-1,i)个,(选好数目后排序方案数为dp[i]/2,因为低高低与高低高的数目是一样的,不过1需要特判只有一种),后面的方案数为dp[n-1-i]/2个,同理。。。然后把三个数相乘即可。具体实现见代码。 当然数据量只有20也可以打表
另一神牛:http://blog.csdn.net/u011262722/article/details/10084215
#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <map>#include <vector>#include <cstdlib>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>#include <functional>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cassert>#include <bitset>#include <stack>#include <ctime>#include <list>#define INF 0x7fffffff#define max3(a,b,c) (max(a,b)>c?max(a,b):c)#define min3(a,b,c) (min(a,b)<c?min(a,b):c)#define mem(a,b) memset(a,b,sizeof(a))using namespace std;__int64 dp[22];__int64 pow(int x){ __int64 sum=1; for(int i=1; i<=x; i++) sum*=i; return sum;}__int64 c(int n,int m) //算组合数{ return pow(n)/pow(m)/pow(n-m);}int main(){ memset(dp,0,sizeof(dp)); dp[1]=1,dp[2]=2,dp[3]=4; int i,j; for(i=4; i<=20; i++) { dp[i]+=dp[i-1]; //最高的在两边*c(i,0) for(j=1; j<i-1; j++) //前面有j个后面有i-1-j个 { if(j==1||i-1-j==1) dp[i] += (dp[j]*dp[i-1-j]>>1)*c(i-1,j); else dp[i] += (dp[j]>>1)*(dp[i-1-j]>>1)*c(i-1,j); } } int tes, cas, x; scanf("%d", &tes); while(tes--) { scanf("%d%d", &cas, &x); printf("%d %I64d\n", cas,dp[x]); } return 0;}
- 20130827组队赛Regionals 2012, North America - Greater NY
- 130827组队赛Regionals 2012, North America - Greater NY
- Regionals 2012, North America - Greater NY 解题报告
- Regionals 2013 :: North America - Greater NY
- North America - Greater NY 2012
- Regionals 2014 >> North America - Greater NY >> 7097 - Growing Rectangular Spiral
- 130825组队赛-Regionals 2012, North America - East Central NA
- North America - Greater NY 2013
- 20131002组队赛-Regionals 2011, North America - Rocky Mountain
- 组队赛 131002 Regionals 2011, North America - Rocky Mountain
- 20131004组队赛-Regionals 2010, North America - East Central NA
- 组队赛131004 Regionals 2010, North America - East Central NA
- Regionals 2014 >> North America - Greater NY >> 7094 - Happy Happy Prime Prime
- 组队练习赛(Regionals 2012, North America - East Central NA)
- 20130902组队赛Regionals 2012, Latin America
- 130902组队赛-Regionals 2012, Latin America
- 20130926组队赛-Regionals 2011, Latin America
- 组队赛130926 Regionals 2011, Latin America
- 9.3 折半查找
- clip:rect('top', 'right', 'bottom', 'left')
- Jackson多态类型数据的反序列化
- hdu4417 Super Mario
- QT 多页面切换之QTabWidget
- 20130827组队赛Regionals 2012, North America - Greater NY
- 使用C/C++扩展Python zz
- 图像二值化算法
- 大把免费编程书籍
- hdu4463 Outlets
- linux 客户端 Socket 非阻塞connect编程
- 技术网址
- 进程上下文、中断上下文、内核代表…
- hdu4461 The Power of Xiangqi