A、题意:一个士兵要买香蕉,第1个香蕉价格是k,第二个香蕉价格是2k,以此类推,现在士兵有钱n要买w个香蕉,问他需要像朋友借多少钱才能买到香蕉
解:ans=max((1+w)*w/2*k-n, 0);
1 /*
2 * Problem:
3 * Author: SHJWUDP
4 * Created Time: 2015/6/24 星期三 13:24:16
5 * File Name: 233.cpp
6 * State:
7 * Memo:
8 */
9 #include <iostream>
10 #include <cstdio>
11 #include <cstring>
12 #include <algorithm>
13
14 using namespace std;
15
16 typedef long long int64;
17
18 int k, n, w;
19 int main() {
20 #ifndef ONLINE_JUDGE
21 freopen("in", "r", stdin);
22 //freopen("out", "w", stdout);
23 #endif
24 while(~scanf("%d%d%d", &k, &n, &w)) {
25 int64 cost=(1LL+w)*w/2*k;
26 printf("%I64d\n", cost<=n?0:cost-n);
27 }
28 return 0;
29 }
View Code
B、题意:给你n个整数,你可以花费w使得一个数x变为x+w,问你最小花费多少使得这n个数各不相同
解:排序后顺次提升即可
1 /*
2 * Problem:
3 * Author: SHJWUDP
4 * Created Time: 2015/6/24 星期三 13:24:16
5 * File Name: 233.cpp
6 * State:
7 * Memo:
8 */
9 #include <iostream>
10 #include <cstdio>
11 #include <cstring>
12 #include <algorithm>
13 #include <queue>
14
15 using namespace std;
16
17 typedef long long int64;
18
19 const int MaxA=3e3+7;
20
21 int n;
22 int arr[MaxA];
23 int main() {
24 #ifndef ONLINE_JUDGE
25 freopen("in", "r", stdin);
26 //freopen("out", "w", stdout);
27 #endif
28 while(~scanf("%d", &n)) {
29 for(int i=0; i<n; i++) {
30 scanf("%d", &arr[i]);
31 }
32 sort(arr, arr+n);
33 int64 ans=0;
34 for(int i=1; i<n; i++) {
35 if(arr[i]<=arr[i-1]) {
36 ans+=arr[i-1]+1-arr[i];
37 arr[i]=arr[i-1]+1;
38 }
39 }
40 printf("%I64d\n", ans);
41 }
42 return 0;
43 }
View Code
C、题意:两个士兵玩卡片游戏(卡片上写有正整数),他们各有一摞顺序确定的卡片,游戏开始后,两人比较最顶端卡片上数字的大小,数字大的赢得这两张卡片,并将赢得的卡片与当次参与比较的卡片放在自己卡片堆的下方(放置顺序为自己的在下,赢得的在上),最后没有卡片者输。问在第几局分出胜负,谁赢了,如果没人赢,输出-1
解:吃我10w次模拟辣,hhh ps:正解 大概是记忆化+bfs
1 /*
2 * Problem:
3 * Author: SHJWUDP
4 * Created Time: 2015/6/24 星期三 13:24:16
5 * File Name: 233.cpp
6 * State:
7 * Memo:
8 */
9 #include <iostream>
10 #include <cstdio>
11 #include <cstring>
12 #include <algorithm>
13 #include <queue>
14
15 using namespace std;
16
17 typedef long long int64;
18
19 const int MaxA=3e3+7;
20
21 int n;
22 int mxA, mxB;
23 int main() {
24 #ifndef ONLINE_JUDGE
25 freopen("in", "r", stdin);
26 //freopen("out", "w", stdout);
27 #endif
28 while(~scanf("%d", &n)) {
29 int num;
30 scanf("%d", &num);
31 queue<int> A;
32 for(int i=0; i<num; i++) {
33 int x;
34 scanf("%d", &x);
35 A.push(x);
36 }
37 scanf("%d", &num);
38 queue<int> B;
39 for(int i=0; i<num; i++) {
40 int x;
41 scanf("%d", &x);
42 B.push(x);
43 }
44 int cnt=1e5+7, ans=0;
45 while(cnt-- && !A.empty() && !B.empty()) {
46 int a=A.front(); A.pop();
47 int b=B.front(); B.pop();
48 if(a>b) {
49 A.push(b); A.push(a);
50 } else {
51 B.push(a); B.push(b);
52 }
53 ans++;
54 }
55 if(A.empty()) {
56 printf("%d 2\n", ans);
57 } else if(B.empty()) printf("%d 1\n", ans);
58 else puts("-1");
59 }
60 return 0;
61 }
View Code
D、题意:对于一个正整数n,它的分数为它的最小因子数,现在给你a,b,(a>b),告诉你n=a!/b!,问你n的分数
解:类似打质数表
1 /*
2 * Problem:
3 * Author: SHJWUDP
4 * Created Time: 2015/6/24 星期三 13:24:16
5 * File Name: 233.cpp
6 * State:
7 * Memo:
8 */
9 #include <iostream>
10 #include <cstdio>
11 #include <cstring>
12 #include <algorithm>
13 #include <queue>
14
15 using namespace std;
16
17 typedef long long int64;
18
19 const int MaxA=5e6+7;
20
21 int A, B;
22 int64 table[MaxA];
23 int main() {
24 #ifndef ONLINE_JUDGE
25 freopen("in", "r", stdin);
26 //freopen("out", "w", stdout);
27 #endif
28 vector<int> prime;
29 memset(table, -1, sizeof(table));
30 table[1]=0;
31 for(int i=2; i<MaxA; i++) {
32 if(table[i]==-1) {
33 table[i]=1;
34 prime.push_back(i);
35 }
36 for(int j=0, lim=prime.size(); j<lim; j++) {
37 int64 tmp=int64(i)*prime[j];
38 if(tmp<MaxA) {
39 table[tmp]=table[i]+1;
40 } else break;
41 }
42 table[i]+=table[i-1];
43 }
44 int T;
45 scanf("%d", &T);
46 while(T--) {
47 scanf("%d%d", &A, &B);
48 printf("%I64d\n", table[A]-table[B]);
49 }
50 return 0;
51 }
View Code
E、题意:有n个城市之间有m条路连接着,每个城市驻守着士兵,现在要改变驻守策略(即改变每个城市驻守士兵的数量),但是每个城市的士兵只能向相邻城市移动一次,问你能否成功,如果成功输出移动方法
解:网络流最大流,将每个城市拆成两点,分别代表入口和出口,
源点对任何点入口建原驻守士兵数量容量边
任何点的入口对自己的出口建立INF容量边
如果a与b间有路,那么建立a入口到b出口的INF容量边
任何点的出口对汇点建变防后驻守士兵数量容量边
那么最大流等于总士兵数时移动可行
1 /*
2 * Problem:
3 * Author: SHJWUDP
4 * Created Time: 2015/7/5 星期日 12:05:43
5 * File Name: 233.cpp
6 * State:
7 * Memo:
8 */
9 #include <iostream>
10 #include <cstdio>
11 #include <cstring>
12 #include <algorithm>
13 #include <queue>
14
15 #define all(o) o.begin(), o.end()
16
17 using namespace std;
18
19 typedef vector<int> vi;
20 typedef long long int64;
21
22 const int INF=0x7f7f7f7f;
23
24 const int MaxA=100+7;
25 const int MaxB=200+7;
26 const int MaxC=MaxA*3+MaxB*2;
27
28 struct Edge {
29 int v, cap;
30 };
31
32 struct Dinic {
33 int n, m, s, t;
34 vector<Edge> edges;
35 vector<vector<int> > g;
36 vector<int> cur, d;
37
38 void init(int n) {
39 this->n=n;
40 m=0;
41 g.resize(n);
42 cur.resize(n);
43 d.resize(n);
44 }
45
46 void add(int u, int v, int cap, bool rev=0) {
47 edges.push_back((Edge){v, cap});
48 edges.push_back((Edge){u, rev?cap:0});
49 m=(int)edges.size();
50 g[u].push_back(m-2);
51 g[v].push_back(m-1);
52 }
53
54 bool BFS() {
55 fill(d.begin(), d.end(), -1);
56 queue<int> Q;
57 Q.push(s);
58 d[s]=0;
59 while(!Q.empty()) {
60 int u=Q.front(); Q.pop();
61 for(int i=(int)g[u].size()-1; i>=0; i--) {
62 Edge& e=edges[g[u][i]];
63 if(d[e.v]==-1 && e.cap>0) {
64 d[e.v]=d[u]+1;
65 Q.push(e.v);
66 }
67 }
68 }
69 return d[t]!=-1;
70 }
71
72 int augment(int u, int a) {
73 if(u==t || a==0) return a;
74 int flow=0, f;
75 for(int i=cur[u]; i>=0; i--) {
76 Edge& e=edges[g[u][i]];
77 if(d[e.v]==d[u]+1 && (f=augment(e.v, min(a, e.cap)))>0) {
78 e.cap-=f; edges[g[u][i]^1].cap+=f;
79 a-=f; flow+=f;
80 if(a==0) break;
81 }
82 }
83 return flow;
84 }
85
86 int maxFlow(int s, int t) {
87 this->s=s; this->t=t;
88 int flow=0;
89 while(BFS()) {
90 for(int i=0; i<n; i++) cur[i]=(int)g[i].size()-1;
91 flow+=augment(s, INF);
92 }
93 return flow;
94 }
95
96 friend ostream& operator<<(ostream& os, Dinic &mf) {
97 os<<"\t\t#begin"<<endl;
98 for(int i=0; i<mf.m; i++) {
99 Edge& e=mf.edges[i];
100 os<<e.v<<"\t"<<e.cap<<endl;
101 }
102 os<<"\t\t#end"<<endl;
103 return os;
104 }
105 };
106
107 int N, M;
108 int main() {
109 #ifndef ONLINE_JUDGE
110 freopen("in", "r", stdin);
111 //freopen("out", "w", stdout);
112 #endif
113 while(~scanf("%d%d", &N, &M)) {
114 vi arr1(N), arr2(N);
115 int s=N<<1, t=s+1;
116 Dinic mf; mf.init(t+1);
117 for(int i=0; i<N; i++) {
118 scanf("%d", &arr1[i]);
119 }
120 for(int i=0; i<N; i++) {
121 scanf("%d", &arr2[i]);
122 }
123 for(int i=0; i<N; i++) {
124 mf.add(s, i, arr1[i]);
125 mf.add(N+i, t, arr2[i]);
126 mf.add(i, N+i, INF);
127 }
128 for(int i=0; i<M; i++) {
129 int a, b;
130 scanf("%d%d", &a, &b), a--, b--;
131 mf.add(a, N+b, INF);
132 mf.add(b, N+a, INF);
133 }
134 vector<Edge> oedges=mf.edges;
135 int flow=mf.maxFlow(s, t);
136 //cout<<mf;
137 if(flow!=accumulate(all(arr1), 0) || flow!=accumulate(all(arr2), 0)) {
138 puts("NO"); continue;
139 }
140 vector<vi > ans(N, vi(N));
141 for(int u=0; u<N; u++) {
142 for(int i=mf.g[u].size()-1; i>=0; i--) {
143 int p=mf.g[u][i];
144 int v=oedges[p].v;
145 if(N<=v && v<N+N) {
146 ans[u][v-N]=oedges[p].cap-mf.edges[p].cap;
147 }
148 }
149 }
150 puts("YES");
151 for(int i=0; i<N; i++) {
152 for(int j=0; j<N; j++) {
153 printf("%d%c", ans[i][j], " \n"[j==N-1]);
154 }
155 }
156 }
157 return 0;
158 }
View Code