0%

实在是太久没写几何题了调试了快一个小时~~~郁闷

简单的计算就行了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112

/* From: Lich_Amnesia
* Time: 2014-02-09 13:55:35
*
* UVA 11178
* */
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <set>
#include <vector>
using namespace std;

const int INF = ~0u>>1;
typedef pair <int,int> P;
#define MID(x,y) ((x+y)>>1)
#define iabs(x) ((x)>0?(x):-(x))
#define REP(i,a,b) for(int i=(a);i<(b);i++)
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define pb push_back
#define mp make_pair
#define print() cout<<"--------"<<endl
#define EPS 1e-8
typedef struct Point {
double x,y;
Point(double x = 0, double y = 0):x(x),y(y){}
void read_point(){
scanf("%lf%lf", &x, &y);
}
}Vector;

struct Line {
Point p;
Vector v;
double a;
Line (Point p = Point(),Vector v = Vector(1,0)):p(p),v(v){
a = atan2(v.y, v.x);
}
bool operator < (const Line &u) const { return a < u.a; }
};

Vector operator + (Vector A, Vector B){
return Vector(A.x + B.x, A.y + B.y);
}
Vector operator - (Vector A, Vector B){
return Vector(A.x - B.x, A.y - B.y);
}
Vector operator * (Vector A, double k){
return Vector(A.x * k, A.y * k);
}

inline double cross(Vector A, Vector B){
return A.x * B.y - A.y * B.x;
}

double Dot(Vector A, Vector B){
return A.x * B.x + A.y * B.y;
}

double Length(Vector A){
return sqrt(Dot(A,A));
}

double Angle(Vector A, Vector B){
return acos(Dot(A, B) / Length(A) / Length(B));
}

inline Vector Rotate(Vector A, double rad){
return Vector(A.x * cos(rad) - A.y * sin(rad),
A.x * sin(rad) + A.y * cos(rad));
}

inline Point intersection_ll(Line a,Line b){
Vector u = a.p - b.p;
double t = cross(b.v, u) / cross(a.v, b.v);
//cout << a.v.x << &#39; &#39; << a.v.y << endl;
return a.p + a.v * t;
}

Point getD(Point A, Point B, Point C){
Vector v1 = C - B;
double a1 = Angle(A - B, v1);
//cout << a1 << endl;
v1 = Rotate(v1,a1 / 3);
Line l1 = Line(B,v1);

Vector v2 = B - C;
double a2 = Angle(A - C, v2);
v2 = Rotate(v2,-a2 / 3);
Line l2 = Line(C,v2);
// cout << l2.p.x << &#39; &#39; << l2.v.y << endl;
return intersection_ll(l1,l2);
}

int main(){
int t;
cin >> t;
Point A,B,C,D,E,F;
while (t --){
A.read_point();
B.read_point();
C.read_point();
D = getD(A,B,C);
E = getD(B,C,A);
F = getD(C,A,B);
printf("%.6lf %.6lf %.6lf %.6lf %.6lf %.6lfn",D.x, D.y, E.x, E.y, F.x, F.y);
}
return 0;
}

Android 应用程序框架

隐藏在每个应用后面的是一系列的服务和系统, 其中包括;

  • 丰富而又可扩展的视图(Views),可以用来构建应用程序, 它包括列表(lists),网格(grids),文本框(text boxes),按钮(buttons), 甚至可嵌入的web浏览器。

  • 内容提供器(Content Providers)使得应用程序可以访问另一个应用程序的数据(如联系人数据库), 或者共享它们自己的数据

  • 资源管理器(Resource Manager)提供 非代码资源的访问,如本地字符串,图形,和布局文件( layout files )。

  • 通知管理器 (Notification Manager) 使得应用程序可以在状态栏中显示自定义的提示信息。

  • 活动管理器( Activity Manager) 用来管理应用程序生命周期并提供常用的导航回退功能。

Android 系统运行库

1)程序库

Android 包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。以下是一些核心库:

  • 系统 C 库 - 一个从 BSD 继承来的标准 C 系统函数库( libc ), 它是专门为基于 embedded linux 的设备定制的。

  • 媒体库 - 基于 PacketVideo OpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。

  • Surface Manager - 对显示子系统的管理,并且为多个应用程序提 供了2D和3D图层的无缝融合。

  • LibWebCore - 一个最新的web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图。

  • SGL - 底层的2D图形引擎

  • 3D libraries - 基于OpenGL ES 1.0 APIs实现;该库可以使用硬件 3D加速(如果可用)或者使用高度优化的3D软加速。

  • FreeType -位图(bitmap)和矢量(vector)字体显示。

  • SQLite - 一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。

2)Android 运行库

Android 包括了一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。

每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。 Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了优化。同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK中 的 “dx” 工具转化成.dex格式由虚拟机执行。

Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。

Android Linux 内核

Android 的核心系统服务依赖于 Linux 2.6 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。 Linux 内核也同时作为硬件和软件栈之间的抽象层


 

因为我们是朋友,所以你可以使用我的文字,但请注明出处:http://alwa.info

题意

有A,B两种机器,给你三个数n,m,k,分别表示机器A有n中工作模式(编号0 ~ n-1),机器B有m种工作模式(编号0~m-1),共有k个任务,每种任务均可以在机器A,B的一个模式下完成。

接下来输入k行,每行三个整数i,u,v,其中,i为任务编号,u表示该任务可在机器A的第u种模式下完成,v表示该任务可在机器B的第v中模式下完成。

但机器A,B在变换模式时均需重启,让你完成所有的任务并使机器重启的次数最小。(机器A,B初始时均在第0模式)

思路

求最小点覆盖,就是求最大匹配

注意点是0的模式不需要匹配,可以求匹配的时候直接从1开始做匹配,或者把跟0模式连的边删掉

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/* From: Lich_Amnesia
* Time: 2014-02-06 10:54:17
*
* ZOJ 1364 || POJ 1325
* */
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <set>
#include <vector>
using namespace std;

const int INF = ~0u>>1;
typedef pair <int,int> P;
#define MID(x,y) ((x+y)>>1)
#define iabs(x) ((x)>0?(x):-(x))
#define REP(i,a,b) for(int i=(a);i<(b);i++)
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define pb push_back
#define mp make_pair
#define print() cout<<"--------"<<endl
#define maxn 110

int x[maxn],y[maxn];
int g[maxn][maxn];
bool vis[maxn];
int zero,n,m,k;

bool path(int u){
for (int v = 0; v < m; v ++){
if (g[u][v] && !vis[v]){
vis[v] = 1;
if (y[v] == -1 || path(y[v])){
x[u] = v;
y[v] = u;
return true;
}
}
}
return false;
}

void MaxMatch(){
int ans = 0;
//if (zero == k) {puts("0");return;}
memset(x, -1, sizeof(x));
memset(y, -1, sizeof(y));
for (int i = 0; i < n; i ++){
if (x[i] == -1){
memset(vis, 0, sizeof(vis));
if (path(i)){
ans ++;
}
}
}
printf("%dn", ans);
}

int main(){
int cnt,u,v;
while (~scanf("%d", &n) && n){
scanf("%d%d", &m, &k);
zero = 0;
memset(g, 0, sizeof(g));
for (int i = 0; i < k; i ++){
scanf("%d%d%d", &cnt, &u, &v);
//g[u][v] = g[v][u] = 1;
if (u != 0 && v != 0) {
g[u][v] = 1;
}
}
MaxMatch();
}
return 0;
}

题意

一次比赛中,共M道题,T个队,p[i][j]表示队i解出题j的概率;

问每队至少解出一题且冠军队至少解出N道题的概率。

思路

f[i][j][k]表示 第i个队伍在前i个题目里过了k道题

dp[i][j] 表示第i个队伍过了1道到 j 道题

ans1 表示1~T个队伍过题数都在 1~M之间的概率

ans2 表示1~T个队伍过题数都在 1~N-1之间概率

ans1 - ans2 就是所求答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/* From: Lich_Amnesia
* Time: 2014-02-05 19:19:45
*
* POJ 2151
* */
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <set>
#include <vector>
using namespace std;

const int INF = ~0u>>1;
typedef pair <int,int> P;
#define MID(x,y) ((x+y)>>1)
#define iabs(x) ((x)>0?(x):-(x))
#define REP(i,a,b) for(int i=(a);i<(b);i++)
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define pb push_back
#define mp make_pair
#define print() cout<<"--------"<<endl

#define maxn 1010
double p[maxn][40],f[maxn][40][40],dp[maxn][40];

int main(){
int m,n,t;
while (~scanf("%d%d%d", &m, &t, &n) && (m + t + n)){
for (int i = 1; i <= t; i ++){
for (int j = 1; j <= m; j ++){
scanf("%lf", &p[i][j]);
}
}
memset(f,0,sizeof(f));
memset(dp,0,sizeof(dp));
//f 表示 第i个人在前i个题目里过了k道题
for (int i = 1; i <= t; i ++){
f[i][1][0] = 1 - p[i][1];
f[i][1][1] = p[i][1];
for (int j = 2; j <= m; j ++){
for (int k = 0; k <= j; k ++){
if (k)
f[i][j][k] = f[i][j - 1][k] * (1 - p[i][j])
+ f[i][j - 1][k - 1] * p[i][j];
else
f[i][j][k] = f[i][j - 1][k] * (1 - p[i][j]);
}
}
}
//dp 表示第i个人过了1-j道题
for (int i = 1; i <= t; i ++){
for (int j = 1; j <= m; j ++){
for (int k = 1; k <= j; k ++){
dp[i][j] += f[i][m][k];
}
}
}

double ans1 = 1;
double ans2 = 1;
for (int i = 1; i <= t; i ++){
ans1 *= dp[i][m];
ans2 *= dp[i][n - 1];
}

printf("%.3fn", ans1 - ans2);
}
return 0;
}

一个源点s,向每部电影连边,容量为电影要拍的天数d

对于每部电影,向它能够拍摄的日子连边,容量为1,这些日子必须在这部电影的限期之内

加入一个汇点t,每个日子向t连边,容量为1,表示一天只能拍摄一部电影

最后判断一下最大流是否等于所有电影要拍的天数和即可。

用邻接矩阵建的图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/* From: Lich_Amnesia
* Time: 2014-02-03 11:00:14
*
* POJ 1698 SAP maxflow
* */
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <set>
#include <vector>
using namespace std;

const int INF = ~0u>>1;
typedef pair <int,int> P;
#define MID(x,y) ((x+y)>>1)
#define iabs(x) ((x)>0?(x):-(x))
#define REP(i,a,b) for(int i=(a);i<(b);i++)
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define pb push_back
#define mp make_pair
#define print() cout<<"--------"<<endl
typedef long long ll;
const int maxn = 400 + 10;
const int inf = 0x7ffffff;
struct SAP{
int cap[maxn][maxn];//
int flow[maxn][maxn];//流量网络
int g[maxn][maxn];
int n; //顶点数
int h[maxn]; // 各顶点距离标号
int vh[maxn];// 各高度顶点个数
int source, sink;
int mk[maxn];
void init(int n){
this->n = n;
memset(cap, 0, sizeof(cap));
}
void addCap(int i, int j, int val){
cap[i][j] = val;
}
int sap(const int idx, const int maxCap){
if (idx == sink) return maxCap;
int li = maxCap, d, minH = n;
for (int i = 0; i < n; i ++){
if (cap[idx][i] - flow[idx][i] > 0){ // 可行流
if (h[idx] == h[i] + 1){
d = sap(i, min(li, cap[idx][i] - flow[idx][i]));
flow[idx][i] += d;
flow[i][idx] -= d;
li -= d;
if (h[source] == n || li == 0) return maxCap - li;
}
minH = min(minH, h[i] + 1);
}
}
//如果没有允许弧
if (li == maxCap){
vh[h[idx]] --;
vh[minH] ++;
if (vh[h[idx]] == 0) h[source] == n;//一个常数优化
h[idx] = minH;
}
return maxCap - li;
}
int solve(int source, int sink){
if (source == sink) return inf;
this->sink = sink;
this->source = source;
memset(flow, 0, sizeof(flow));
memset(h, 0, sizeof(h));//标号数组
memset(vh, 0, sizeof(vh));
int ans = 0;
while (h[source] != n)
ans += sap(source, inf);
return ans;
}

}mf;

int week[10];
int main(){
int T;
cin >> T;
while (T--){
int n,d,w;
scanf("%d", &n);
mf.init(401);
int source = 0,sink = 400, sum = 0;
for (int i = 1; i <= n; i ++){
for (int j = 1; j <= 7; j ++){
scanf("%d", &week[j]);
}
scanf("%d%d", &d, &w);
sum += d;
mf.addCap(source, i, d);
for (int j = 1; j <= 7; j ++){
if (week[j]){
for (int k = 0; k < w; k ++){
int id = n + k * 7 + j;
mf.addCap(i, id, 1);
mf.addCap(id, sink, 1);
}
}
}
}
int maxflow = mf.solve(source, sink);
// cout << maxflow << &#39; &#39; << sum << endl;
if (maxflow == sum) puts("Yes");
else puts("No");

}
return 0;
}

链接地址:http://alwa.name/lol.html

舍友说什么以后宿舍开黑LOL来一个随机生成的位置,一时兴起花了两个小时用js写了一下这个生成器.功能简单,界面丑陋.



暂时先这样,等开学再加新功能和美化

[​](http://alwa.name/blog/wp-content/uploads/2014/01/Dodecaedro_desarrollo.gif) [这里](http://en.wikipedia.org/wiki/Dodecahedron)看到一个十二面体~便萌生出12面体做12月份,做出一个12面体的日历的冲动
然后在[这里](http://folk.uib.no/nmioa/kalender/),竟然找到了一个十二面体日历的生成网页,直接download就能把pdf下载下来了。
有很多的形式可以选择,主要分两种十二面体的制作。
我选择了第一个(看起来很好做),直接打印,
按照提示:Cut along solid line;score and fold along dotted lines;
没什么难度,主要就是最后那个超级难粘起来,因为我最后粘的都是要粘的面最多那几个,就很难弄,最好先从要粘的面多的开始粘,也许最后会好弄点。
完成图:
![](file:///C:UsersAlwaDocumentsTencent Files459577895Image172BD122E8C5587089E43649B8F31148.jpg)![](file:///C:UsersAlwaDocumentsTencent Files459577895Image172BD122E8C5587089E43649B8F31148.jpg)![](file:///C:UsersAlwaDocumentsTencent Files459577895Image172BD122E8C5587089E43649B8F31148.jpg)[![QQ图片20140131225024](http://alwa.host.smartgslb.com/blog/wp-content/uploads/2014/01/QQ图片20140131225024-225x300.jpg)](http://alwa.host.smartgslb.com/blog/wp-content/uploads/2014/01/QQ图片20140131225024.jpg)

一个序列,开始时为1,接下来每步,该序列中的1变为01,0变为10,求第n步时序列中连续的0有多少对?

令Sn表示第n个序列,~Sn表示第n个序列的反,An表示第n步时序列中连续的0的对数。

0 : 1
1 : 01
2 : 1001
3 : 01101001
4 : 1001011001101001
5 : 01101001100101101001011001101001

观察可得,Sn=~S(n-1)+S(n-1);

(1)当n为奇数时,Sn中连续的1和0的数相同

~Sn的末位和Sn的首位都是0,

A(n+1)=An+An +1;

(2)当n为偶数时,Sn中连续的1比0的少1

~Sn的末位是0,Sn的首位都是0,

A(n+1)=An+An - 1;

然后根据这个以及高中数学找出一个关系式子,求出An的表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.io.*;
import java.util.*;
import java.math.*;

public class Main{
public static void main(String[] args){
int n;
BigInteger two,ans;
Scanner in = new Scanner(System.in);
while (in.hasNext()){
n = in.nextInt();
two = BigInteger.valueOf(2);
ans = two;
if(n % 2 == 0)
{
ans = ans.pow(n-1).subtract(two).divide(BigInteger.valueOf(3)).add(BigInteger.ONE);
}
else
{
ans = ans.pow(n-1).subtract(BigInteger.ONE).divide(BigInteger.valueOf(3));
}
System.out.println(ans);
}
}
}

另外的写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.*;
import java.math.*;

public class Main{
public static void main(String[] args){
int n;
BigInteger a[]=new BigInteger[1001];
a[1]=BigInteger.ZERO;
for(int i=2;i<=1000;i++){
if(i%2==0) a[i]=a[i-1].multiply(BigInteger.valueOf(2)).add(BigInteger.ONE);
else a[i]=a[i-1].multiply(BigInteger.valueOf(2)).subtract(BigInteger.ONE);
}
Scanner cin = new Scanner(System.in);
while(cin.hasNext())
{
n = cin.nextInt();
System.out.println(a[n]);
}
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/* From: Lich_Amnesia
* Time: 2014-01-26 12:57:00
*
*
* */
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <set>
#include <vector>
using namespace std;

const int INF = ~0u>>1;
typedef pair <int,int> P;
#define MID(x,y) ((x+y)>>1)
#define iabs(x) ((x)>0?(x):-(x))
#define REP(i,a,b) for(int i=(a);i<(b);i++)
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define pb push_back
#define mp make_pair
#define print() cout<<"--------"<<endl
#define EPS 1e-10
bool check(int a,int b,int c){
if (a && b && c && a + b > c && a + c > b && b + c > a)
return 1;
else return 0;
}

double solve(int a,int b,int c){
double p = (a+b+c+0.0)/2;
return sqrt(p * (p-a) * (p-b) * (p-c));
}

double ans = 0.0;
int a,b,c,cnt;
bool vis[12];
int num[4][3];
void dfs(int i){
if (i > 3){
if (check(a,b,c))
ans = max(ans,solve(a,b,c));
return;
}
for (int j = 0; j < 6; j ++){
if (j < 3){
switch(j){
case 0:a += num[i][1] + num[i][2]; dfs(i+1); a-=(num[i][1] + num[i][2]); break;
case 1:b += num[i][1] + num[i][2]; dfs(i+1); b-=(num[i][1] + num[i][2]);break;
case 2:c += num[i][1] + num[i][2]; dfs(i+1); c-=(num[i][1] + num[i][2]);break;
}
}
if (!vis[j]){
if (j == 3){
vis[j] = 1;
a += num[i][1];
c += num[i][2];
dfs(i+1);
a -= num[i][1];
c -= num[i][2];
vis[j] = 0;

vis[j] = 1;
a += num[i][2];
c += num[i][1];
dfs(i+1);
a -= num[i][2];
c -= num[i][1];
vis[j] = 0;
}
else if (j == 4){
vis[j] = 1;
a += num[i][1];
b += num[i][2];
dfs(i+1);
a -= num[i][1];
b -= num[i][2];
vis[j] = 0;

vis[j] = 1;
a += num[i][2];
b += num[i][1];
dfs(i+1);
a -= num[i][2];
b -= num[i][1];
vis[j] = 0;
}
else if (j == 5){
vis[j] = 1;
b += num[i][1];
c += num[i][2];
dfs(i+1);
b -= num[i][1];
c -= num[i][2];
vis[j] = 0;

vis[j] = 1;
b += num[i][2];
c += num[i][1];
dfs(i+1);
b -= num[i][2];
c -= num[i][1];
vis[j] = 0;
}
}
}
}

int main(){
while (~scanf("%d%d",&num[1][1], &num[1][2])){
scanf("%d%d",&num[2][1], &num[2][2]);
scanf("%d%d",&num[3][1], &num[3][2]);
ans = 0.0;a=b=c=0;
memset(vis,0,sizeof(vis));
dfs(1);
printf("%.9fn",ans);
}
return 0;
}