I-Little Boxes【大数】
hdu6225 http://acm.hdu.edu.cn/showproblem.php?pid=6225
题意:
就是给四个大数,输出和。
思路:
java大法好。用long longWA了一发
1 import java.math.BigInteger; 2 import java.util.Scanner; 3 4 public class Main { 5 6 //static Scanner scan; 7 //static BigInteger a, b, c, d; 8 static public void main(String[] args){ 9 Scanner scan = new Scanner(System.in); 10 int t = scan.nextInt(); 11 BigInteger a, b, c, d; 12 for(int i = 0; i < t; i++){ 13 a = scan.nextBigInteger(); 14 b = scan.nextBigInteger(); 15 c = scan.nextBigInteger(); 16 d = scan.nextBigInteger(); 17 BigInteger ans = a.add(b).add(c).add(d); 18 19 System.out.println(ans); 20 } 21 22 } 23 }
K-Rabbits
hdu6227 http://acm.hdu.edu.cn/showproblem.php?pid=6227
1 #include2 3 using namespace std; 4 const int maxn = 500 + 5; 5 6 int a[maxn]; 7 8 int main() 9 { 10 int T; 11 cin >> T; 12 while (T--) { 13 int N; 14 cin >> N; 15 int ans = 0; 16 for (int i = 0; i < N; i++) { 17 scanf("%d", a+i); 18 if (i >= 1) 19 ans += a[i]-a[i-1]-1; 20 } 21 ans -= min(a[1]-a[0]-1, a[N-1]-a[N-2]-1); 22 cout << ans << endl; 23 } 24 return 0; 25 } 26 /* 27 5 28 6 29 1 3 5 7 9 11 30 6 31 1 3 5 7 9 12 32 */
F-Haron and His Triangle【大数】【规律】
hdu6222 http://acm.hdu.edu.cn/showproblem.php?pid=6222
题意:一个三角形的边长分别是t -1, t, t+1,要求他的面积是整数。问大于等于n的最小的t是多少。
思路:首先海伦公式推出一个式子。打了前10000的表,czc秒看出递推公式。i+1 = 4 * i - (i-1)。又一次java大法。因为刚好10^30忘记放进去了WA了一发,下次还是要注意不要开刚好的,稍微大一点。
1 import java.math.BigInteger; 2 import java.util.Scanner; 3 4 public class Main { 5 6 //static Scanner scan; 7 //static BigInteger a, b, c, d; 8 static BigInteger[] num = new BigInteger[100000]; 9 static public void main(String[] args){ 10 Scanner scan = new Scanner(System.in); 11 num[1] = new BigInteger("4"); 12 num[2] = new BigInteger("14"); 13 BigInteger maxn = new BigInteger("10"); 14 maxn = maxn.pow(31); 15 //System.out.println(maxn); 16 int i; 17 for(i = 3; ; i++){ 18 num[i] = new BigInteger("0"); 19 BigInteger x = new BigInteger("4"); 20 BigInteger tmp = BigInteger.ZERO; 21 tmp = num[i - 1].multiply(x); 22 tmp = tmp.subtract(num[i - 2]); 23 if(tmp.compareTo(maxn) == 1)break; 24 else num[i] = tmp; 25 } 26 27 //System.out.println(i); 28 int t = scan.nextInt(); 29 for(int cas = 1; cas <= t; cas++){ 30 BigInteger n = scan.nextBigInteger(); 31 for(int j = 1; j <= i; j++){ 32 if(num[j].compareTo(n) != -1){ 33 System.out.println(num[j]); 34 break; 35 } 36 } 37 } 38 } 39 }
L-Tree【DFS】
hdu6228 http://acm.hdu.edu.cn/showproblem.php?pid=6228
题意:
给一棵有n个节点的树上k种颜色。边集Ei表示使颜色i的所有节点联通的最小边集。求所有边集E的交集的最大值。
思路:
一条边可行或是不可行,就看他连接的两块。如果两块的大小都大于等于k,那么这条边肯定是交集的一部分,因为肯定存在一种上色方案使得左边k种颜色右边k种,而且大家肯定都要经过这条边,所以这条边肯定在交集里面。DFS一遍。
正好碰上大二他们周赛拉了这题自己写了一下
1 #include2 #include <set> 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include
1 #include2 using namespace std; 3 const int maxn=150000+10; 4 5 int n,k; 6 int ans; 7 8 struct Edge{ 9 int u,v; 10 Edge(int u=0,int v=0){this->u=u,this->v=v;} 11 }; 12 vector E; 13 vector<int> G[maxn]; 14 void init(int l,int r) 15 { 16 E.clear(); 17 for(int i=l;i<=r;i++) G[i].clear(); 18 } 19 void addedge(int u,int v) 20 { 21 E.push_back(Edge(u,v)); 22 G[u].push_back(E.size()-1); 23 } 24 25 int vis[maxn]; 26 int dfs(int now) 27 { 28 vis[now]=1; 29 int tot=1; 30 for(int i=0;i ) 31 { 32 Edge &e=E[G[now][i]]; int nxt=e.v; 33 if(!vis[nxt]) tot+=dfs(nxt); 34 } 35 if(n-tot>=k && tot>=k) ans++; 36 return tot; 37 } 38 39 int main() 40 { 41 int T; 42 cin>>T; 43 while(T--) 44 { 45 scanf("%d%d",&n,&k); 46 init(1,n); 47 for(int i=1;i ) 48 { 49 int u,v; 50 scanf("%d%d",&u,&v); 51 addedge(u,v); 52 addedge(v,u); 53 } 54 55 memset(vis,0,sizeof(vis)); 56 ans=0; 57 dfs(1); 58 printf("%d\n",ans); 59 } 60 }
M-Wandering Robots【概率】(未)
hdu6229 http://acm.hdu.edu.cn/showproblem.php?pid=6229
题意:
给定一个n*n的矩形,机器人初始在(0,0)。矩形中有k个障碍物,给定他们的坐标。机器人在格子(i,j)时,他走到邻近的可走的格子和停留在原地的概率相同。
问最后机器人停在(x,y)其中x+y>=n-1的概率是多少。
思路:
当我们走了很久以后,每一个格子都已经走到了。那么对于这个正方形来说,每一个小格子都有xi种走法(即自己+相邻的可走的格子数),总的正方形一共有N种走法。对于某一个格子(i,j)有(自己+相邻的可走的格子数)种走法是可以到达自己的。所以答案就是要求区域的走法/所有格子的走法
由于n比较大数组是开不下的,所以只能存障碍。用map来映射一下。
1 #include2 using namespace std; 3 typedef pair<int,int> pii; 4 5 const int maxn=10000+10; 6 const int maxk=1000+10; 7 const int dx[4]={0,1,0,-1}; 8 const int dy[4]={1,0,-1,0}; 9 10 int n,k; 11 map bool> mp; 12 int p,q; 13 14 inline int gcd(int m,int n){return n?gcd(n,m%n):m;} 15 inline int check(const int &x,const int &y) 16 { 17 if(x<0||x>=n||y<0||y>=n) return 0; 18 19 if((x==0||x==n-1) && (y==0||y==n-1)) return 3; 20 else if((x==0||x==n-1) && (y!=0&&y!=n-1)) return 4; 21 else if((y==0||y==n-1) && (x!=0&&x!=n-1)) return 4; 22 else return 5; 23 } 24 25 int main() 26 { 27 int T; 28 cin>>T; 29 for(int kase=1;kase<=T;kase++) 30 { 31 mp.clear(); 32 33 scanf("%d%d",&n,&k); 34 for(int i=1,x,y;i<=k;i++) 35 { 36 scanf("%d%d",&x,&y); 37 mp[make_pair(x,y)]=1; 38 } 39 40 p=3*3+2*(n-2)*4+(n-2)*(n-1)/2*5; 41 q=4*3+4*(n-2)*4+(n-2)*(n-2)*5; 42 for(map bool>::iterator it=mp.begin();it!=mp.end();it++) 43 { 44 int x=((*it).first).first; 45 int y=((*it).first).second; 46 if(x+y>=n-1) p-=check(x,y); 47 q-=check(x,y); 48 49 for(int i=0;i<4;i++) 50 { 51 int nxtx=x+dx[i]; 52 int nxty=y+dy[i]; 53 if(check(nxtx,nxty)>0 && mp.count(make_pair(nxtx,nxty))==0) 54 { 55 if(nxtx+nxty>=n-1) p--; 56 q--; 57 } 58 } 59 } 60 61 int g=gcd(p,q); 62 printf("Case #%d: %d/%d\n",kase,p/g,q/g); 63 } 64 }
G--Infinite Fraction Path【暴力】【规律】(未)
hdu6223 http://acm.hdu.edu.cn/showproblem.php?pid=6223
题意:
给定一个串,第i位会走到第(i*i+1)%n位去。问能表示的最大的数是多少。
思路:
发现循环节很短,暴力。
1 #include2 3 using namespace std; 4 typedef long long ll; 5 const int MAX_L = 50; 6 const int MAX_N = 150000 + 5; 7 8 int ind[MAX_N]; 9 int ansind[MAX_L]; 10 bool vis[MAX_N]; 11 12 int main() 13 { 14 int T, kase = 1; 15 cin >> T; 16 while (T--) { 17 int N; 18 string num; 19 cin >> N >> num; 20 for (ll i = 0; i < N; i++) 21 ind[i] = (i*i+1)%N; 22 23 string ans; 24 for (int jjj = 0; jjj < MAX_L; jjj++) 25 ans += '0'; 26 for (int i = 0; i < N; i++) { 27 int jjj = 0, iii = i; 28 while (jjj < MAX_L && num[iii] == ans[jjj]) { 29 iii = ind[iii]; 30 jjj++; 31 } 32 if (num[iii] < ans[jjj]) 33 continue; 34 while (jjj < MAX_L) { 35 ans[jjj] = num[iii]; 36 ansind[jjj] = iii; 37 jjj++; 38 iii = ind[iii]; 39 } 40 } 41 memset(vis, false, sizeof vis); 42 int j; 43 for (j = MAX_L-1; j >= 0; j--) { 44 if (vis[ansind[j]]) 45 break; 46 vis[ansind[j]] = true; 47 } 48 int jjjjj = ansind[j]; 49 printf("Case #%d: ", kase++); 50 for (int i = 0; i < N; i++) { 51 if (i < MAX_L) 52 cout << ans[i]; 53 else { 54 jjjjj = ind[jjjjj]; 55 cout << num[jjjjj]; 56 } 57 } 58 cout << endl; 59 } 60 return 0; 61 } 62 /* 63 4 64 3 65 149 66 5 67 12345 68 7 69 3214567 70 9 71 261025520 72 */
C-Empty Convex Polygon【最大空凸包】
poj1259The Picnic & hdu6219
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=6219
http://poj.org/problem?id=1259
一份代码A两题。
题意:
给n个点,求一个面积最大的空凸包。
思路:
空凸包,就是一个内部没有其他给定点的凸包。
详细讲解见:https://blog.csdn.net/nyroro/article/details/45268767
总的来说就是先枚举凸包的最左下角的点O。按照极坐标排序。
dp[i][j]表示组成凸包的最后一个三角形的是Oij时的最大面积。dp[i][j]=max(dp[i][j],triangle(O,i,j)+dp[j][k])
再枚举凸包上最后的一个点i,枚举所有比i小的合法的j。
具体讲解见:https://blog.csdn.net/cdsszjj/article/details/79366813
复杂度O(n^3)
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include
H-Legends of the Three Kingdoms
题意:
三国杀游戏大模拟。有主公忠臣反贼内奸,告诉你他们的血量,每回合砍一个人,主公忠臣不会互相砍。为最后的胜率。
思路:
因为血量最大是40,4个人 ,所以可以暴力记忆化搜索。
存一下当前这样分数的情况下的胜率。
dfs的时候先判断有没有出现游戏结束,再判断如果当前回合轮到的人死了怎么办
然后就是根据回合砍人,找到胜率最大的更新。
数组刚开始开到45MLE了,然后TLE了。因为用了memset。
其实每次是不需要重新初始化的,因为相当于边跑边打表。反正是不影响的。而且memset emmm...秦皇岛T的还不够开心吗。
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include
以及:
本次重现最令人开心的事情哈哈哈哈哈哈哈哈哈哈哈哈