ID Title Hint
A Impasse (+)  
B Chess  
C An interesting game 最小费用最大流
D n a^o7 !  
E Fruit Ninja I dp
F Pixel density
G Mine Number dfs
H The Best Seat in ACM Contest
I Pick apples 贪心,背包
J Fruit Ninja II 积分

B.

d.国际象棋?就是求能被0~16个棋子吃掉的棋子分别有几个。

s.当时有点思路,感觉对。但是时间好像不大够,也没敲。

用二分查找,查询周围16个位置有棋子没,能不能把它吃掉。

棋子个数n <= 10^5。

10^5*16*log(10^5)<=4*10^7

C.

d.

s.这个题感觉也可以,不知道为啥wa了。

感觉直接暴力贪心就行啊,题意理解错了吗?

c.上个刁丝测试代码。。。数据比较大的时候可以找到不同的,但是还是不懂为什么贪心不行。。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include<string.h>
  5. #include <vector>
  6. #include <queue>
  7. #include<time.h>
  8. using namespace std;
  9. const int maxn=;
  10. const int oo=0x3f3f3f3f;
  11. struct Edge
  12. {
  13. int u, v, cap, flow, cost;
  14. Edge(int u, int v, int cap, int flow, int cost):u(u), v(v), cap(cap), flow(flow), cost(cost) {}
  15. };
  16. struct MCMF
  17. {
  18. int n, m, s, t;
  19. vector<Edge> edge;
  20. vector<int> G[maxn];
  21. int inq[maxn], d[maxn], p[maxn], a[maxn];
  22. void init(int n)
  23. {
  24. this->n=n;
  25. for(int i=; i<n; i++)
  26. G[i].clear();
  27. edge.clear();
  28. }
  29. void AddEdge(int u, int v, int cap, int cost)
  30. {
  31. edge.push_back(Edge(u, v, cap, , cost));
  32. edge.push_back(Edge(v, u, , , -cost));
  33. m=edge.size();
  34. G[u].push_back(m-);
  35. G[v].push_back(m-);
  36. }
  37. bool spfa(int s, int t, int& flow, int& cost)
  38. {
  39. memset(d, 0x3f, sizeof d);
  40. memset(inq, , sizeof inq);
  41. d[s]=, inq[s]=, p[s]=, a[s]=oo;
  42.  
  43. queue<int> q;
  44. q.push(s);
  45. while(!q.empty())
  46. {
  47. int u=q.front();
  48. q.pop();
  49. inq[u]=;
  50. for(int i=; i<G[u].size(); i++)
  51. {
  52. Edge& e=edge[G[u][i]];
  53. if(e.cap>e.flow && d[e.v]>d[u]+e.cost)
  54. {
  55. d[e.v]=d[u]+e.cost;
  56. p[e.v]=G[u][i];
  57. a[e.v]=min(a[u], e.cap-e.flow);
  58. if(!inq[e.v])
  59. {
  60. q.push(e.v);
  61. inq[e.v]=;
  62. }
  63. }
  64. }
  65. }
  66. if(d[t]==oo)return false;
  67. flow+=a[t];
  68. cost+=d[t]*a[t];
  69. int u=t;
  70. while(u!=s)
  71. {
  72. edge[p[u]].flow+=a[t];
  73. edge[p[u]^].flow-=a[t];
  74. u=edge[p[u]].u;
  75. }
  76. return true;
  77. }
  78. int MinCost(int s, int t)
  79. {
  80. int flow=, cost=;
  81. while(spfa(s, t, flow, cost));
  82. return cost;
  83. }
  84. } net;
  85.  
  86. int a[maxn], b[maxn];
  87.  
  88. struct node{
  89. int h;
  90. int id;
  91. int h2;
  92. }a2[],a3[];
  93.  
  94. bool cmp(node a,node b){
  95. if(a.h!=b.h)return a.h<b.h;
  96. return a.h2<b.h2;
  97. }
  98. bool cmp2(node a,node b){
  99. if(a.h!=b.h)return a.h<b.h;
  100. return a.h2<b.h2;
  101. }
  102.  
  103. int test1[]={,,,,,,,,,,,,,,,,,,,,,,,,,,
  104. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  105. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  106. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  107. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  108. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  109. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  110. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  111. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  112. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  113. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  114. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  115. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  116. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  117. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  118. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  119. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  120. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  121. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  122. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  123. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  124. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  125. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  126. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  127. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  128. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  129. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  130. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  131. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  132. ,,,,,,,,,,,,,,,,,,,,,,,,
  133. };
  134. int test2[]={
  135. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  136. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  137. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  138. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  139. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  140. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  141. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  142. ,,,,,,,,,,,,,,,,,,,,,,,,,,,
  143. ,,,,,,,,,,,,,,,,,,,,,,,,,,
  144. ,,,,,,,,,,,,,,,,,,,,,,,,,,
  145. ,,,,,,,,,,,,,,,,,,,,,,,,,,,
  146. ,,,,,,,,,,,,,,,,,,,,,,,,,,,
  147. ,,,,,,,,,,,,,,,,,,,,,,,,,,,
  148. ,,,,,,,,,,,,,,,,,,,,,,,,,,,
  149. ,,,,,,,,,,,,,,,,,,,,,,,,,,
  150. ,,,,,,,,,,,,,,,,,,,,,,,,,,,
  151. ,,,,,,,,,,,,,,,,,,,,,,,,,,,
  152. ,,,,,,,,,,,,,,,,,,,,,,,,,,
  153. ,,,,,,,,,,,,,,,,,,,,,,,,,,,
  154. ,,,,,,,,,,,,,,,,,,,,,,,,,,
  155. ,,,,,,,,,,,,,,,,,,,,,,,,,,,
  156. ,,,,,,,,,,,,,,,,,,,,,,,,,,
  157. ,,,,,,,,,,,,,,,,,,,,,,,,,,,
  158. ,,,,,,,,,,,,,,,,,,,,,,,,,,,
  159. ,,,,,,,,,,,,,,,,,,,,,,,,,,,
  160. ,,,,,,,,,,,,,,,,,,,,,,,,,,,
  161. ,,,,,,,,,,,,
  162. };
  163.  
  164. int temp;
  165.  
  166. int f(int N,int M,int K,int b[]){
  167.  
  168. int T;
  169. //int N,M,K;
  170. //int a[1005],b[1005];
  171. int i;
  172. int ca=;
  173. int sum;
  174. //int a2[1005],a3[1005];
  175. int p1,p2,p3,p4,q1,q2;
  176. int t1,t2;
  177. bool use[];
  178.  
  179. //scanf("%d",&T);
  180.  
  181. //while(T--){
  182.  
  183. //scanf("%d%d%d",&N,&M,&K);
  184.  
  185. //for(i=0;i<N;++i){
  186. // scanf("%d",&a[i]);
  187. //}
  188. sum=;
  189. for(i=;i<N-;++i){
  190. sum=sum+abs(a[i]-a[i+]);
  191. temp=sum;
  192.  
  193. if(a[i]>a[i+]){
  194. a2[i].h=a[i];
  195. a2[i].h2=a[i+];
  196.  
  197. a3[i].h=a[i+];
  198. a3[i].h2=a[i];
  199.  
  200. a2[i].id=i;
  201. a3[i].id=i;
  202. }
  203. else{
  204. a2[i].h=a[i+];
  205. a2[i].h2=a[i];
  206.  
  207. a3[i].h=a[i];
  208. a3[i].h2=a[i+];
  209.  
  210. a2[i].id=i;
  211. a3[i].id=i;
  212. }
  213. /*
  214. cout<<"i: "<<i<<" a2[i].h "<<a2[i].h<<endl;
  215. cout<<"i: "<<i<<" a2[i].h2 "<<a2[i].h2<<endl;
  216. */
  217. }
  218. /*
  219. i=1;
  220. cout<<"##"<<endl;
  221. cout<<"i: "<<i<<" a2[i].h "<<a2[i].h<<endl;
  222. cout<<"i: "<<i<<" a2[i].h2 "<<a2[i].h2<<endl;
  223. */
  224. /*
  225. i=1;
  226. cout<<"##"<<endl;
  227. cout<<"i: "<<i<<" a2[i].h "<<a2[i].h<<endl;
  228. cout<<"i: "<<i<<" a2[i].h2 "<<a2[i].h2<<endl;
  229. */
  230.  
  231. sort(a2,a2+(N-),cmp);
  232. sort(a3,a3+(N-),cmp2);
  233. /*
  234. i=1;
  235. cout<<"##"<<endl;
  236. cout<<"i: "<<i<<" a2[i].h "<<a2[i].h<<endl;
  237. cout<<"i: "<<i<<" a2[i].h2 "<<a2[i].h2<<endl;
  238. */
  239. /*
  240. i=1;
  241. cout<<"##"<<endl;
  242. cout<<"i: "<<i<<" a2[i].h "<<a2[i].h<<endl;
  243. cout<<"i: "<<i<<" a2[i].h2 "<<a2[i].h2<<endl;
  244. */
  245.  
  246. //for(i=0;i<M;++i){
  247. // scanf("%d",&b[i]);
  248. //}
  249. sort(b,b+M);
  250.  
  251. p1=;p2=N-;
  252. p3=;p4=N-;
  253. q1=;q2=M-;
  254. memset(use,false,sizeof(use));
  255. for(i=;i<K;++i){
  256.  
  257. if(p1<||p2<||p3<||p4<||q1<||q2<){
  258. cout<<"越界"<<endl;
  259. }
  260. if(p1>N-||p2>N-||p3>N-||p4>N-||q1>M-||q2>M-){
  261. cout<<"越界2"<<endl;
  262. }
  263.  
  264. while(use[a2[p1].id]==true){
  265. ++p1;
  266. }
  267. //cout<<"p1 "<<p1<<endl;
  268. t1=b[q2]-a2[p1].h;
  269. //cout<<"t1 "<<t1<<endl;
  270. if(t1<){
  271. t1=;
  272. }
  273. while(use[a3[p4].id]==true){
  274. --p4;
  275. }
  276.  
  277. //cout<<"p4 :"<<p4<<endl;
  278. t2=a3[p4].h-b[q1];
  279. //cout<<"t2 "<<t2<<endl;
  280. if(t2<){
  281. t2=;
  282. }
  283.  
  284. if(t1>t2){
  285. sum=sum+*t1;
  286. use[a2[p1].id]=true;
  287.  
  288. //
  289. //cout<<a2[p1].id<<"### t1: "<<t1<<endl;
  290.  
  291. ++p1;
  292. --q2;
  293.  
  294. }
  295. else{
  296. sum=sum+*t2;
  297. use[a3[p4].id]=true;
  298.  
  299. //
  300. //cout<<a3[p4].id<<"else t2: "<<t2<<endl;
  301.  
  302. --p4;
  303. ++q1;
  304. }
  305.  
  306. //cout<<"i:"<<i<<",sum:"<<sum<<endl;
  307. }
  308.  
  309. //printf("Case %d: %d\n",++ca,sum);
  310.  
  311. return sum;
  312.  
  313. // }
  314.  
  315. }
  316.  
  317. int main()
  318. {
  319.  
  320. int ccc[maxn];
  321. int tot;
  322. int T, kase=;
  323. //scanf("%d", &T);
  324. T=;
  325. T=;
  326. srand(time(NULL));
  327. while(T--)
  328. {
  329. int n, m, k, ans=;
  330.  
  331. n=;
  332. m=;
  333. k=;
  334.  
  335. n=;
  336. m=;
  337. k=;
  338. //scanf("%d%d%d", &n, &m, &k);
  339. net.init(n+);
  340. memset(b, , sizeof b);
  341.  
  342. for(int i=; i<n; i++){
  343. a[i]=rand()%;
  344.  
  345. //a[i]=test1[i];
  346.  
  347. //scanf("%d", a+i);
  348. }
  349.  
  350. tot=;
  351. for(int i=; i<m; i++)
  352. {
  353. int x;
  354. /*
  355. x=rand()%31;
  356. //scanf("%d", &x);
  357. b[x]++;
  358. ccc[tot++]=x;
  359.  
  360. */
  361. // /*
  362.  
  363. int fuck=rand()%;
  364. b[fuck]++;
  365. ccc[tot++]=fuck;
  366. // */
  367.  
  368. }
  369. for(int i=; i<n; i++)
  370. {
  371. ans+=abs(a[i]-a[i-]);
  372. net.AddEdge(, i, , );
  373. for(int j=; j<=; j++)
  374. if(b[j])
  375. {
  376. int dis=abs(a[i]-j)+abs(a[i-]-j)-abs(a[i]-a[i-]);
  377. net.AddEdge(i, n+j, , -dis);
  378. }
  379. }
  380. int S=n+, T=S+;
  381. for(int i=; i<=; i++)
  382. if(b[i])
  383. net.AddEdge(i+n, T, b[i], );
  384. net.AddEdge(S, , k, );
  385.  
  386. int ans2=net.MinCost(S, T);
  387. int ans1=ans-ans2;
  388. //printf("Case %d: %d\n", ++kase, );
  389.  
  390. //cout<<"贪心:"<<endl;
  391. int tanxin=f(n,m,k,ccc);
  392.  
  393. if(ans1!=tanxin){
  394.  
  395. cout<<"ans:"<<ans<<endl;
  396. cout<<"ans2:"<<ans2<<endl;
  397.  
  398. cout<<"temp:"<<temp<<endl;
  399. cout<<tanxin-temp<<endl;
  400.  
  401. cout<<"yes"<<endl;
  402. cout<<"a:"<<endl;
  403. for(int i=;i<n;++i){
  404. cout<<a[i]<<',';
  405. }
  406. cout<<endl;
  407.  
  408. cout<<"ccc:"<<endl;
  409. for(int i=;i<m;++i){
  410. cout<<ccc[i]<<',';
  411. }
  412. cout<<endl;
  413.  
  414. cout<<endl;
  415.  
  416. cout<<ans1<<"网络流"<<endl;
  417. cout<<tanxin<<"贪心"<<endl;
  418. //return 0;
  419.  
  420. }
  421. }
  422.  
  423. return ;
  424. }
  425. /*
  426. yes
  427. a:
  428. 14,20,20,3,10,28,1,19,3,26,29,17,27,11,5,24,3,20,2,8,8,0,11,0,19,29,10,23,17,3,1
  429. 4,28,14,8,6,6,8,5,15,1,23,28,17,9,15,20,13,6,3,11,8,6,23,3,1,21,13,20,17,0,16,14
  430. ,4,1,18,27,25,21,29,13,19,11,10,22,2,27,0,19,1,8,7,18,7,5,11,22,23,24,22,3,27,3,
  431. 17,21,26,8,17,17,17,19,12,28,14,17,28,19,25,12,10,1,30,6,1,1,29,16,0,6,22,27,25,
  432. 25,3,0,0,29,8,29,19,24,9,27,15,1,11,28,28,7,0,24,8,17,16,13,14,29,2,12,23,22,12,
  433. 25,13,19,21,11,9,10,9,16,16,13,20,22,10,30,29,27,12,23,16,11,22,24,9,15,4,26,4,1
  434. 5,19,16,16,19,27,27,30,11,27,27,4,22,19,24,29,10,28,27,2,30,29,19,3,8,21,4,2,4,2
  435. ,23,13,6,20,21,5,10,2,8,3,2,3,17,10,7,25,16,13,12,10,23,30,27,22,24,6,10,0,0,30,
  436. 7,0,1,1,18,29,5,19,10,8,30,30,0,15,3,17,2,12,22,1,8,20,14,2,15,10,17,4,26,23,19,
  437. 15,25,30,17,23,13,18,24,15,1,15,14,5,13,18,10,28,11,11,30,15,0,2,28,4,27,29,21,3
  438. 0,1,29,8,6,1,21,13,8,29,24,13,22,1,3,20,8,7,25,26,21,11,3,3,10,9,24,27,5,5,7,9,1
  439. 6,17,18,0,5,9,12,10,29,9,20,24,11,4,3,30,12,30,26,6,17,14,20,15,26,17,27,28,15,2
  440. 1,15,27,12,24,25,24,17,3,25,9,0,3,15,12,28,6,0,3,17,27,7,26,10,9,13,24,4,21,21,1
  441. 9,20,29,15,15,0,24,22,17,30,2,6,21,12,21,16,24,4,10,25,6,18,26,19,5,7,17,18,7,1,
  442. 12,13,15,17,21,14,13,17,9,14,4,6,1,13,12,28,1,0,11,29,22,3,25,3,11,21,12,22,5,18
  443. ,7,5,0,12,26,11,17,8,14,0,18,6,7,8,30,23,19,0,26,6,15,23,24,30,29,11,20,2,21,14,
  444. 4,20,24,1,15,28,30,14,19,8,22,2,23,3,14,20,30,1,1,1,12,17,12,0,2,1,29,18,17,17,5
  445. ,17,21,8,8,23,15,11,2,18,30,12,26,9,13,15,11,30,12,23,21,5,18,12,4,20,8,15,19,19
  446. ,16,26,24,8,6,23,11,11,9,4,7,22,27,1,24,1,29,19,12,4,18,25,1,5,4,3,25,25,6,0,3,6
  447. ,23,23,15,4,6,21,10,20,25,19,11,4,26,4,28,8,8,22,26,12,6,20,28,24,7,4,11,25,28,2
  448. 3,0,25,1,3,0,2,10,11,20,4,21,8,15,11,10,6,1,30,2,6,2,6,0,9,19,13,27,30,21,13,18,
  449. 17,10,21,27,23,2,5,13,15,10,4,4,18,10,9,5,7,10,24,19,12,2,12,26,6,25,8,18,3,13,1
  450. 9,16,19,15,28,11,16,8,29,15,13,23,24,2,2,19,0,7,23,14,2,28,22,2,0,26,16,18,11,19
  451. ,0,10,19,5,26,8,8,8,13,5,30,20,29,21,30,3,7,29,27,19,28,13,2,15,18,28,13,5,24,13
  452. ,15,27,9,29,0,7,16,28,12,1,9,4,8,6,12,11,12,14,22,28,20,14,8,17,25,20,13,16,6,8,
  453. 3,7,7,28,17,23,17,13,16,0,19,23,5,17,6,20,21,9,14,30,2,26,7,5,30,24,2,10,23,22,8
  454. ,19,4,9,27,29,11,4,13,23,8,18,6,6,1,18,5,17,6,18,13,6,30,6,28,9,22,9,11,3,3,4,25
  455. ,29,3,10,19,26,14,11,29,9,23,4,0,23,29,14,2,21,29,18,10,10,3,2,4,16,20,23,2,5,0,
  456. 11,10,1,19,14,10,4,15,22,25,8,10,12,25,15,30,5,2,30,10,5,30,7,3,23,23,19,18,3,10
  457. ,13,2,30,16,30,2,6,22,30,3,4,28,6,2,22,3,3,5,20,14,16,12,14,28,12,
  458. ccc:
  459. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,
  460. 1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,
  461. 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
  462. 4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,
  463. 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,
  464. 7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
  465. 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10
  466. ,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,1
  467. 1,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,
  468. 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13
  469. ,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,1
  470. 4,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
  471. 15,15,15,15,15,15,15,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16,16,16,16,16,16
  472. ,16,16,16,16,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,17,17,17,17,17,17,1
  473. 7,17,17,17,17,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,
  474. 18,18,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19
  475. ,19,19,19,19,19,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,2
  476. 0,20,20,20,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,
  477. 21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,22,22,22,22,22,22
  478. ,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,2
  479. 3,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,
  480. 24,24,24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25
  481. ,25,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,2
  482. 7,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,28,28,
  483. 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,29
  484. ,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,30,30,30,30,30,30,30,30,30,30,3
  485. 0,30,30,30,30,30,30,30,30,30,30,30,30,30,
  486.  
  487. 25090网络流
  488. 25086贪心
  489.  
  490. Process returned 0 (0x0) execution time : 1.981 s
  491. Press any key to continue.
  492.  
  493. */
  494.  
  495. /*
  496. #include <iostream>
  497. #include <cmath>
  498. #include <vector>
  499. #include <cstdlib>
  500. #include <cstdio>
  501. #include <cstring>
  502. #include <queue>
  503. #include <stack>
  504. #include <list>
  505. #include <algorithm>
  506. #include <map>
  507. #include <set>
  508. #define LL long long
  509. #define Pr pair<int,int>
  510. #define fread() freopen("data1.in","r",stdin)
  511. #define fwrite() freopen("out.out","w",stdout)
  512.  
  513. using namespace std;
  514. const int INF = 0x3f3f3f3f;
  515. const int msz = 10000;
  516. const int mod = 1e9+7;
  517. const double eps = 1e-8;
  518.  
  519. struct Edge
  520. {
  521. int v,f,w,next;
  522. };
  523.  
  524. Edge eg[66666];
  525. int head[2333],h[2333],hcnt[2333];
  526. int dis[2333],pre[2333];
  527. bool vis[2333];
  528. int tp,ans,minf;
  529.  
  530. void Add(int u,int v,int w,int f)
  531. {
  532. eg[tp].v = v;
  533. eg[tp].w = w;
  534. eg[tp].f = f;
  535. eg[tp].next = head[u];
  536. head[u] = tp++;
  537. }
  538.  
  539. bool bfs(int st,int en)
  540. {
  541. memset(dis,-1,sizeof(dis));
  542. memset(vis,0,sizeof(vis));
  543. memset(pre,-1,sizeof(pre));
  544. queue <int> q;
  545. q.push(st);
  546. dis[st] = 0;
  547. minf = INF;
  548. int u,v,w,f;
  549.  
  550. while(!q.empty())
  551. {
  552. u = q.front();
  553. q.pop();
  554. vis[u] = 0;
  555.  
  556. for(int i = head[u]; i != -1; i = eg[i].next)
  557. {
  558. v = eg[i].v;
  559. w = eg[i].w;
  560. f = eg[i].f;
  561. if(f && (dis[v] == -1 || dis[v] < dis[u]+w))
  562. {
  563. dis[v] = dis[u]+w;
  564. minf = min(f,minf);
  565. pre[v] = i;
  566. if(!vis[v])
  567. {
  568. q.push(v);
  569. vis[v] = 1;
  570. }
  571. }
  572. }
  573. }
  574.  
  575. if(pre[en] == -1) return false;
  576.  
  577. ans += dis[en];
  578. for(int i = pre[en]; i != -1; i = pre[eg[i^1].v])
  579. {
  580. eg[i].f -= minf;
  581. eg[i^1].f += minf;
  582. }
  583.  
  584. return true;
  585. }
  586.  
  587. int main()
  588. {
  589.  
  590. int t,n,m,k,x;
  591. scanf("%d",&t);
  592. for(int z = 1; z <= t; ++z)
  593. {
  594. scanf("%d%d%d",&n,&m,&k);
  595. memset(head,-1,sizeof(head));
  596. memset(hcnt,0,sizeof(hcnt));
  597. tp = 0;
  598. ans = 0;
  599. for(int i = 0; i < n; ++i)
  600. {
  601. scanf("%d",&h[i]);
  602. if(i) ans += abs(h[i]-h[i-1]);
  603. }
  604. while(m--)
  605. {
  606. scanf("%d",&x);
  607. hcnt[x]++;
  608. }
  609.  
  610. //n为起点 0~n-2表示初始第i个山爬到i+1山路程 n+1~n+30表示高1~30的山数 n+31表示起点前的一个点(限流) n+32表示终点
  611. Add(n+33,n+31,0,k);
  612. Add(n+31,n+33,0,0);
  613. for(int i = 0; i <= 30; ++i)
  614. {
  615. if(!hcnt[i]) continue;
  616. Add(n+31,n+i,0,hcnt[i]);
  617. Add(n+i,n+31,0,0);
  618. for(int j = 0; j < n-1; ++j)
  619. {
  620. Add(n+i,j,abs(h[j]-i)+abs(h[j+1]-i)-abs(h[j]-h[j+1]),hcnt[i]);
  621. Add(j,n+i,-abs(h[j]-i)-abs(h[j+1]-i)+abs(h[j]-h[j+1]),0);
  622. }
  623. }
  624. for(int j = 0; j < n-1; ++j)
  625. {
  626. Add(j,n+32,0,1);
  627. Add(n+32,j,0,0);
  628. }
  629. while(bfs(n+33,n+32));
  630. printf("Case %d: %d\n",z,ans);
  631. }
  632.  
  633. return 0;
  634. }
  635.  
  636. */

s.正宗解法,最小费用流

参考:山东省第三届省赛 C 题 – An interesting game(费用流)

ps:参考的这个代码比较快,600ms。 我的好像得1000多。。。

大意:有n个山坡,排成一排,为了增加难度,现在要从m个山坡中挑选k个,插入到原有的n个山坡中,两个原有的山坡中只能插入一个山坡,原有山坡的两侧不能插入。使插入k个山坡后的难度最大,总的难度是相邻两个山坡差值绝对值的和。
思路:训练赛的时候根本没往图论上想,当时想贪心不太可能,还以为是dp。
如果把原问题看做是原有山坡的排列中,两个相邻山坡中间的间隙和m个山坡做匹配的话,就可以看做是,最大流量为k时,最大费用是多少,费用流可以搞。对于最大费用,可以先把费用取负值,求出最小费用后再取负值,就是最大费用。匹配的费用是插入之后的难度的增加量,最大费用加上原山坡的难度,就是答案。
因为n和m的范围是[2, 1000],直接建图会TLE,发现插入的m个山坡的范围只有[0, 30],这么小的数据范围一定能优化答案,把插入山坡的高度看做结点,建图。
设置源点S,超级源点SS,汇点T。
S对所有间隙连边,容量1,费用0.
所有间隙对所有高度连边,容量1,费用是难度增加量的相反数.
所有高度对T连边,容量为此高度的个数,费用0.
SS对S连边,容量k,费用0.
答案就是原图的难度-最小费用。

c.最小费用最大流

  1. /*
  2. SPFA版费用流
  3. 最小费用最大流,求最大费用最大流只需要取相反数,结果取相反数即可。
  4. 点的总数为N,点的编号0~N-1
  5. */
  6. #include<iostream>
  7. #include<stdio.h>
  8. #include<string.h>
  9. #include<queue>
  10. #include<algorithm>
  11. using namespace std;
  12.  
  13. const int MAXN=;
  14. const int MAXM=;
  15. const int INF=0x3f3f3f3f;
  16. struct Edge{
  17. int to,next,cap,flow,cost;
  18. }edge[MAXM];
  19. int head[MAXN],tol;
  20. int pre[MAXN],dis[MAXN];
  21. bool vis[MAXN];
  22. int N;//节点总个数,节点编号从0~N-1
  23. void init(int n){
  24. N=n;
  25. tol=;
  26. memset(head,-,sizeof(head));
  27. }
  28. void addedge(int u,int v,int cap,int cost){
  29. edge[tol].to=v;
  30. edge[tol].cap=cap;
  31. edge[tol].cost=cost;
  32. edge[tol].flow=;
  33. edge[tol].next=head[u];
  34. head[u]=tol++;
  35. edge[tol].to=u;
  36. edge[tol].cap=;
  37. edge[tol].cost=-cost;
  38. edge[tol].flow=;
  39. edge[tol].next=head[v];
  40. head[v]=tol++;
  41. }
  42. bool spfa(int s,int t){
  43. queue<int>q;
  44. for(int i=;i<N;i++){
  45. dis[i]=INF;
  46. vis[i]=false;
  47. pre[i]=-;
  48. }
  49. dis[s]=;
  50. vis[s]=true;
  51. q.push(s);
  52. while(!q.empty()){
  53. int u=q.front();
  54. q.pop();
  55. vis[u]=false;
  56. for(int i=head[u];i!=-;i=edge[i].next){
  57. int v=edge[i].to;
  58. if(edge[i].cap>edge[i].flow&&dis[v]>dis[u]+edge[i].cost){
  59. dis[v]=dis[u]+edge[i].cost;
  60. pre[v]=i;
  61. if(!vis[v]){
  62. vis[v]=true;
  63. q.push(v);
  64. }
  65. }
  66. }
  67. }
  68. if(pre[t]==-)return false;
  69. else return true;
  70. }
  71. //返回的是最大流,cost存的是最小费用
  72. int minCostMaxflow(int s,int t,int &cost){
  73. int flow=;
  74. cost=;
  75. while(spfa(s,t)){
  76. int Min=INF;
  77. for(int i=pre[t];i!=-;i=pre[edge[i^].to]){
  78. if(Min>edge[i].cap-edge[i].flow)
  79. Min=edge[i].cap-edge[i].flow;
  80. }
  81. for(int i=pre[t];i!=-;i=pre[edge[i^].to]){
  82. edge[i].flow+=Min;
  83. edge[i^].flow-=Min;
  84. cost+=edge[i].cost*Min;
  85. }
  86. flow+=Min;
  87. }
  88. return flow;
  89. }
  90.  
  91. int main(){
  92.  
  93. int T;
  94. int N2,M,K;
  95. int X[],Y[];
  96. int YNum[];
  97. int i,j;
  98. int sp,sp2;//源点,源点2
  99. int sc;//汇点
  100. int sum;
  101. int tmp;
  102. int mi_cost;
  103. int ma_flow;
  104. int ca=;
  105.  
  106. scanf("%d",&T);
  107.  
  108. while(T--){
  109.  
  110. scanf("%d%d%d",&N2,&M,&K);
  111.  
  112. init(N2+);
  113.  
  114. for(i=;i<N2;++i){
  115. scanf("%d",&X[i]);
  116. }
  117. memset(YNum,,sizeof(YNum));
  118. for(i=;i<M;++i){
  119. scanf("%d",&Y[i]);
  120. ++YNum[Y[i]];
  121. }
  122.  
  123. sum=;
  124. for(i=;i<N2-;++i){//初始值
  125. sum=sum+abs(X[i]-X[i+]);
  126. }
  127.  
  128. sp=N2+;
  129.  
  130. for(i=;i<N2-;++i){//加边
  131. addedge(sp,i,,);//源点到空隙
  132. for(j=;j<=;++j){
  133. if(YNum[j]){
  134. tmp=abs(X[i]-j)+abs(X[i+]-j)-abs(X[i]-X[i+]);
  135. addedge(i,N2+j,,-tmp);//空隙到M个山丘
  136. }
  137. }
  138. }
  139.  
  140. sp2=N2+;
  141. sc=N2+;
  142. addedge(sp2,sp,K,);
  143. for(i=;i<=;++i){
  144. if(YNum[i]){
  145. addedge(N2+i,sc,YNum[i],);
  146. }
  147. }
  148.  
  149. ma_flow=minCostMaxflow(sp2,sc,mi_cost);
  150.  
  151. printf("Case %d: %d\n",++ca,sum-mi_cost);
  152. }
  153.  
  154. return ;
  155. }

D.

d.好像是按要求输出串

s.没写这个题

c.张

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <string>
  4. #include <cstring>
  5. #define MAX 500
  6. using namespace std;
  7. int main ()
  8. {
  9. char temp1[MAX],temp2[MAX],str[MAX];
  10. strcpy(temp1," n5!wpuea^o7!usimdnaevoli");
  11. strcpy(temp2," usimdnaevolin5!wpuea^o7!");
  12. int Len = strlen(temp1);
  13. int T;
  14. scanf("%d",&T);
  15. getchar();
  16. int coun=;
  17. while(T--)
  18. {
  19. gets(str);
  20. int len=strlen(str);
  21. for(int i=,j=; i<len; i++)
  22. {
  23. for(j=; j<Len; j++)
  24. if(str[i]==temp1[j])
  25. break;
  26. if(j<Len) str[i]=temp2[j];
  27. }
  28. printf("Case %d: ",coun++);
  29. for(int i=len-; i>=; i--)
  30. printf("%c",str[i]);
  31. printf("\n");
  32. }
  33. return ;
  34. }

E.

d.水果忍者,水果从上向下掉落,并且只能水平切。

给你n个水果的出现时间,出现的水平位置,和他是否是好水果,切到好水果+1,切到坏水果-1,连续切到三个以上好水果分数加倍。

两刀之间的间隔大于等于m,求能求得的最大分数。

s.先求出每一秒出手能得到的最大的得分,很简单。

再用DP求最大分数。

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. using namespace std;
  5.  
  6. #define MAXN 10010
  7.  
  8. int d[MAXN][];//d[i][j]标志i秒j位置水果
  9. int dp[MAXN];//dp[i]表示前i秒获得的最大分数
  10.  
  11. int main(){
  12.  
  13. int T;
  14. int n,m;
  15. int t,s,p;
  16. int i,j;
  17. int ma_t;//最大时间
  18. int ma_p[MAXN];//每秒最大位置
  19. int sum,num,ma;//
  20. int ma_sum[MAXN];//每秒可获得的最大分数
  21. int ca=;
  22.  
  23. scanf("%d",&T);
  24.  
  25. while(T--){
  26. scanf("%d%d",&n,&m);
  27.  
  28. memset(d,-,sizeof(d));
  29. ma_t=;
  30. memset(ma_p,,sizeof(ma_p));
  31. for(i=;i<n;++i){
  32. scanf("%d%d%d",&t,&s,&p);
  33. d[t][p]=s;
  34. if(t>ma_t){
  35. ma_t=t;
  36. }
  37. if(p>ma_p[t]){
  38. ma_p[t]=p;
  39. }
  40. }
  41.  
  42. memset(ma_sum,,sizeof(ma_sum));
  43. for(i=;i<=ma_t;++i){//先求出每秒可获得的最大分数
  44. sum=;
  45. num=;
  46. ma=;
  47. for(j=;j<=ma_p[i];++j){
  48. if(d[i][j]==){
  49. ++num;
  50. }
  51. else if(d[i][j]==){
  52. if(num>=){
  53. sum=sum+num*;
  54. }
  55. else{
  56. sum=sum+num;
  57. }
  58. if(sum>ma){
  59. ma=sum;
  60. }
  61. num=;
  62. --sum;
  63. if(sum<){
  64. sum=;
  65. }
  66. }
  67. }
  68. if(num>){
  69. if(num>=){
  70. sum=sum+num*;
  71. }
  72. else{
  73. sum=sum+num;
  74. }
  75. if(sum>ma){
  76. ma=sum;
  77. }
  78. }
  79. ma_sum[i]=ma;
  80. }
  81.  
  82. memset(dp,,sizeof(dp));
  83. for(i=;i<=m;++i){
  84. dp[i]=max(dp[i-],ma_sum[i]);//不出手,和出手
  85. }
  86. for(i=m+;i<=ma_t;++i){
  87. dp[i]=max(dp[i-],dp[i-m-]+ma_sum[i]);
  88. }
  89.  
  90. printf("Case %d: %d\n",++ca,dp[ma_t]);
  91. }
  92.  
  93. return ;
  94. }

F.

d.串中提取数字

s.比较坑的是里面空格只要一个就行了

c.当时臃肿的代码。虽然长,但是思路还可以

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<math.h>
  5. using namespace std;
  6.  
  7. char str[];
  8.  
  9. char str1[];
  10. char str2[];
  11.  
  12. char num1[];
  13. char num2[];
  14. char num3[];
  15.  
  16. int main(){
  17.  
  18. int T;
  19. int i;
  20. int len;
  21. int len1,len2;
  22. int p1,p2;
  23. int p3,p4;
  24. int len_num1,len_num2,len_num3;
  25. int j;
  26. double a,a1,a2,b,b1,b2,c,c1,c2;
  27. int p5;
  28. double Dp;
  29. double ans;
  30. int ca=;
  31. int p6,p7;
  32.  
  33. /*
  34. num1 num2 num3
  35. The new iPad 0009.7 inches 2048*1536 PAD
  36. p3 p1 p2 p4
  37.  
  38. 0009.7 2048*1536
  39. p5
  40. p6,07是考虑了后面的小数点,实际好像后面只能是整数
  41.  
  42. */
  43.  
  44. scanf("%d",&T);
  45. getchar();
  46.  
  47. while(T--){
  48. scanf("%[^\n]",str);
  49. getchar();
  50.  
  51. len=strlen(str);
  52.  
  53. len1=;
  54. len2=;
  55. len_num1=;
  56. len_num2=;
  57. len_num3=;
  58.  
  59. for(i=;i<len;++i){
  60. if(str[i]=='i'){
  61. if(str[i+]=='n'&&str[i+]=='c'&&str[i+]=='h'&&
  62. str[i+]=='e'&&str[i+]=='s'&&str[i+]==' '){
  63. p1=i;
  64. j=i-;
  65. while(str[j]==' '){
  66. --j;
  67. }
  68. while(str[j]!=' '){
  69. num1[len_num1++]=str[j--];
  70. }
  71. while(str[j]==' '){
  72. --j;
  73. }
  74. p3=j;
  75. }
  76. }
  77. if(str[i]=='*'){
  78. if(i>=&&''<=str[i-]&&str[i-]<=''){
  79. if(''<=str[i+]&&str[i+]<=''){
  80. p2=i;
  81. j=i-;
  82. while(str[j]!=' '){
  83. num2[len_num2++]=str[j--];
  84. }
  85.  
  86. j=i+;
  87. while(str[j]!=' '){
  88. num3[len_num3++]=str[j++];
  89. }
  90.  
  91. while(str[j]==' '){
  92. ++j;
  93. }
  94. p4=j;
  95. }
  96. }
  97. }
  98.  
  99. }
  100.  
  101. for(i=;i<=p3;++i){
  102. if(str[i]!=' '){
  103. break;
  104. }
  105. }
  106. str1[len1++]=str[i++];
  107. for(;i<=p3;++i){
  108. if(str[i]==' '&&str1[len1-]==' '){
  109. continue;
  110. }
  111. str1[len1++]=str[i];
  112. }
  113. str1[len1]='\0';
  114.  
  115. for(i=p4;i<len;++i){
  116. if(str[i]==' '&&str2[len2-]==' '){
  117. continue;
  118. }
  119. if('a'<=str[i]&&str[i]<='z'){
  120. str2[len2++]=str[i];
  121. }
  122. else if('A'<=str[i]&&str[i]<='Z'){
  123. str2[len2++]=str[i]+;
  124. }
  125. else{
  126. str2[len2++]=str[i];
  127. }
  128.  
  129. }
  130. str2[len2]='\0';
  131.  
  132. for(i=len2-;i>=;--i){
  133. if(str2[i]!=' '){
  134. len2=i+;
  135. break;
  136. }
  137. }
  138. str2[i+]='\0';
  139.  
  140. p5=-;
  141. for(i=;i<len_num1;++i){
  142. if(num1[i]=='.'){
  143. p5=i;
  144. break;
  145. }
  146. }
  147. a=;
  148. a1=;
  149. a2=;
  150. if(p5==-){
  151. for(i=;i<len_num1;++i){
  152. a1=a1+(num1[i]-'')*pow(,i);
  153. }
  154. }
  155. else{
  156. for(i=;i<p5;++i){
  157. a2=a2/+(num1[i]-'')/10.0;
  158. }
  159. for(i=p5+;i<len_num1;++i){
  160. a1=a1+(num1[i]-'')*pow(,(i-(p5+)));
  161. }
  162. }
  163.  
  164. a=a1+a2;
  165.  
  166. if(a==){
  167. printf("Case %d: The %s of %s's PPI is %.2f.\n",++ca,str2,str1,0.0);
  168. continue;
  169. }
  170.  
  171. p6=-;
  172. for(i=;i<len_num2;++i){
  173. if(num2[i]=='.'){
  174. p6=i;
  175. break;
  176. }
  177. }
  178. if(p6==-){
  179. b=;
  180. for(i=;i<len_num2;++i){
  181. b=b+(num2[i]-'')*pow(,i);
  182. }
  183. }
  184. else{
  185. b=;
  186. b1=;
  187. b2=;
  188. for(i=;i<p6;++i){
  189. b2=b2/+(num2[i]-'')/10.0;
  190. }
  191. for(i=p6+;i<len_num2;++i){
  192. b1=b1+(num2[i]-'')*pow(,(i-(p6+)));
  193. }
  194. b=b1+b2;
  195. }
  196.  
  197. p7=-;
  198. for(i=;i<len_num3;++i){
  199. if(num3[i]=='.'){
  200. p7=i;
  201. break;
  202. }
  203. }
  204. if(p7==-){
  205. c=;
  206. for(i=;i<len_num3;++i){
  207. c=c*+(num3[i]-'');
  208. }
  209. }
  210. else{
  211. c=;
  212. c1=;
  213. c2=;
  214. for(i=;i<p7;++i){
  215. c1=c1*+(num3[i]-'');
  216. }
  217. for(i=p7+;i<len_num3;++i){
  218. c2=c2/+(num3[i]-'')/10.0;
  219. }
  220.  
  221. c=c1+c2;
  222.  
  223. }
  224.  
  225. Dp=sqrt(b*b+c*c);
  226. ans=Dp/a;
  227.  
  228. printf("Case %d: The %s of %s's PPI is %.2f.\n",++ca,str2,str1,ans);
  229. }
  230.  
  231. return ;
  232. }

G.

d.类似于扫雷的游戏,这里不是周围8个位置,而是上下左右加它自己5个位置。给出周围多少个雷的数组,求出雷的分布。

s.dfs。先确定第一行,下面的每个位置只看上面的位置即可。

  1. #include<iostream>
  2. #include<stdio.h>
  3. using namespace std;
  4.  
  5. int d[][];
  6. char g[][];
  7.  
  8. int n,m;
  9. int dir[][]={{-,},{,},{,-},{,},{,}};
  10. bool stop;
  11.  
  12. void dfs(int r,int c);
  13.  
  14. void f1(int r,int c){
  15. int i;
  16. int a,b;
  17. g[r][c]='*';
  18. for(i=;i<;++i){
  19. a=r+dir[i][];
  20. b=c+dir[i][];
  21. if( <=a&&a<n && <=b&&b<m ){
  22. --d[a][b];
  23. }
  24. }
  25. if(c==m-){
  26. a=r+;
  27. b=;
  28. }
  29. else{
  30. a=r;
  31. b=c+;
  32. }
  33. dfs(a,b);
  34. g[r][c]='\0';
  35. for(i=;i<;++i){
  36. a=r+dir[i][];
  37. b=c+dir[i][];
  38. if( <=a&&a<n && <=b&&b<m ){
  39. ++d[a][b];
  40. }
  41. }
  42. }
  43. void f2(int r,int c){
  44. int a,b;
  45. g[r][c]='.';
  46.  
  47. if(c==m-){
  48. a=r+;
  49. b=;
  50. }
  51. else{
  52. a=r;
  53. b=c+;
  54. }
  55. dfs(a,b);
  56. g[r][c]='\0';
  57. }
  58.  
  59. void dfs(int r,int c){
  60. int i,j;
  61.  
  62. if(r==n){
  63. for(i=;i<m;++i){
  64. if(d[n-][i]!=){
  65. return;
  66. }
  67. }
  68. stop=true;
  69. for(i=;i<n;++i){
  70. for(j=;j<m;++j){
  71. printf("%c",g[i][j]);
  72. }
  73. printf("\n");
  74. }
  75. return;
  76. }
  77. int a,b;
  78. if(r==){
  79.  
  80. bool flag=true;//可以放雷
  81. for(i=;i<;++i){
  82. a=r+dir[i][];
  83. b=c+dir[i][];
  84. if( <=a&&a<n && <=b&&b<m ){
  85. if(d[a][b]==){
  86. flag=false;
  87. break;
  88. }
  89. }
  90. }
  91.  
  92. if(flag){
  93. f1(r,c);
  94. if(stop){
  95. return;
  96. }
  97. }
  98. f2(r,c);
  99. }
  100. else{
  101.  
  102. if(d[r-][c]==){
  103. f1(r,c);
  104. if(stop){
  105. return;
  106. }
  107. }
  108. else if(d[r-][c]==){
  109. f2(r,c);
  110. }
  111. }
  112. }
  113.  
  114. int main(){
  115.  
  116. int T;
  117. int i,j;
  118. int ca=;
  119. char str[];
  120.  
  121. scanf("%d",&T);
  122.  
  123. while(T--){
  124. scanf("%d%d",&n,&m);
  125. for(i=;i<n;++i){
  126. scanf("%s",str);
  127. for(j=;j<m;++j){
  128. d[i][j]=str[j]-'';
  129. }
  130. }
  131.  
  132. printf("Case %d:\n",++ca);
  133. stop=false;
  134. dfs(,);
  135.  
  136. }
  137.  
  138. return ;
  139. }

H.

d.在一个N*M(N,M<=20)的矩阵中,某个位置的值取决于上下左右和它自己,求出所有位置的值。

s.双重循环,直接求一遍就行了。

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. using namespace std;
  5.  
  6. int dir[][]={{-,},{,},{,-},{,}};
  7.  
  8. int main(){
  9.  
  10. int T;
  11. int N,M;
  12. int s[][];
  13. int v[][];
  14. int i,j;
  15. int a,b;
  16. int ma,ma_i,ma_j;
  17. int ca=;
  18. int k;
  19.  
  20. scanf("%d",&T);
  21.  
  22. while(T--){
  23. scanf("%d%d",&N,&M);
  24.  
  25. for(i=;i<N;++i){
  26. for(j=;j<M;++j){
  27. scanf("%d",&s[i][j]);
  28. }
  29. }
  30.  
  31. memset(v,,sizeof(v));
  32.  
  33. for(i=;i<N;++i){
  34. for(j=;j<M;++j){
  35. for(k=;k<;++k){
  36. a=i+dir[k][];
  37. b=j+dir[k][];
  38. if(a<||b<||a>=N||b>=M){
  39. v[i][j]-=;
  40. continue;
  41. }
  42. if(s[a][b]>s[i][j]){
  43. v[i][j]=v[i][j]+(s[a][b]-s[i][j]);
  44. }
  45. else{
  46. v[i][j]=v[i][j]-(s[i][j]-s[a][b]);
  47. }
  48. }
  49. }
  50. }
  51.  
  52. ma=v[][];
  53. ma_i=;
  54. ma_j=;
  55. for(i=;i<N;++i){
  56. for(j=;j<M;++j){
  57. if(v[i][j]>=ma){
  58. ma=v[i][j];
  59. ma_i=i;
  60. ma_j=j;
  61. }
  62. }
  63. }
  64.  
  65. printf("Case %d: %d %d %d\n",++ca,ma,ma_i+,ma_j+);
  66. }
  67.  
  68. return ;
  69. }

I.

d.比较直接的一个完全背包,但是大小有这么大V <= 100,000,000

s.很显然,直接来会爆内存了。

但是这个题物品大小不大1 <= S<= 100。然后很萎缩的5000以上贪心,剩余的用完全背包。。。

为什么过了?

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<algorithm>
  4. #include<string.h>
  5. using namespace std;
  6.  
  7. struct node{
  8. long long S;
  9. long long P;
  10. double q;
  11. }a[];
  12.  
  13. bool cmp(node a,node b){
  14. return a.q>b.q;
  15. }
  16.  
  17. int main(){
  18.  
  19. int T;
  20. long long V;
  21. long long sum;
  22. long long dp[];
  23. long long tmp;
  24. int i,j;
  25. int ca=;
  26.  
  27. scanf("%d",&T);
  28.  
  29. while(T--){
  30. scanf("%lld%lld",&a[].S,&a[].P);
  31. a[].q=(double)(a[].P)/a[].S;
  32. //cout<<a[0].q<<endl;
  33. scanf("%lld%lld",&a[].S,&a[].P);
  34. a[].q=(double)(a[].P)/a[].S;
  35. //cout<<a[1].q<<endl;
  36. scanf("%lld%lld",&a[].S,&a[].P);
  37. a[].q=(double)(a[].P)/a[].S;
  38. //cout<<a[2].q<<endl;
  39. scanf("%lld",&V);
  40.  
  41. sort(a,a+,cmp);
  42.  
  43. sum=V%a[].S;
  44.  
  45. for(i=;;++i){
  46. if(a[].S*i>=){
  47. break;
  48. }
  49. }
  50.  
  51. sum=sum+a[].S*i;
  52.  
  53. memset(dp,,sizeof(dp));
  54.  
  55. for(i=;i<;++i){
  56. for(j=a[i].S;j<=sum;++j){
  57. tmp=dp[j-a[i].S]+a[i].P;
  58. if(tmp>dp[j]){
  59. dp[j]=tmp;
  60. }
  61. }
  62. }
  63.  
  64. for(i=sum;;--i){
  65. if(dp[i]>){
  66. break;
  67. }
  68. }
  69.  
  70. printf("Case %d: %lld\n",++ca,((V-sum)/a[].S)*a[].P+dp[i]);
  71.  
  72. }
  73.  
  74. return ;
  75. }

J.

d.好像是积分求椭球体的体积。

c.王

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <cmath>
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8. int T;
  9. scanf("%d",&T);
  10. int i;
  11. for(i=; i<=T; i++)
  12. {
  13. int a,b,h;
  14. scanf("%d%d%d",&a,&b,&h);
  15. double V;
  16. V=(4.0/)*M_PI*a*b*b;
  17. if(h>=b)
  18. {
  19. printf("Case %d: %.3lf\n",i,V);
  20. }
  21. else
  22. {
  23. double v=M_PI*a*b*(b-h)-M_PI*(1.0*a/b)*(1.0/)*(b*b*b-h*h*h);
  24. if(V-v-v>)
  25. printf("Case %d: %.3lf\n",i,V-v);
  26. else
  27. printf("Case %d: %.3lf\n",i,v);
  28. }
  29. }
  30. return ;
  31. }

山东省第三届ACM省赛的更多相关文章

  1. Sdut 2409 The Best Seat in ACM Contest(山东省第三届ACM省赛 H 题)(模拟)

    题目描述 Cainiao is a university student who loves ACM contest very much. It is a festival for him once ...

  2. Sdut 2416 Fruit Ninja II(山东省第三届ACM省赛 J 题)(解析几何)

    Time Limit: 5000MS Memory limit: 65536K 题目描述 Haveyou ever played a popular game named "Fruit Ni ...

  3. sdut2408 pick apples (贪心+背包)山东省第三届ACM省赛

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/svitter/article/details/24642587 本文出自:http://blog.c ...

  4. [原]sdut2624 Contest Print Server (大水+大坑)山东省第四届ACM省赛

    本文出自:http://blog.csdn.net/svitter 原题:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&am ...

  5. [2012山东省第三届ACM大学生程序设计竞赛]——n a^o7 !

    n a^o7 ! 题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2413 Time Lim ...

  6. [2012山东省第三届ACM大学生程序设计竞赛]——Mine Number

    Mine Number 题目:http://acm.sdut.edu.cn/sdutoj/problem.php? action=showproblem&problemid=2410 Time ...

  7. 山东省第八届ACM省赛游记

    Day 1: 凌晨,来了几分兴致,和队友在VJudge上开了一把zoj月赛,WA一发闷一口拿铁,一瓶拿铁 不一会就被喝完了!好气啊!遂开始愉快地打游戏,打着打着,woc,居然3点半了,小睡片 刻,咬上 ...

  8. 2012年"浪潮杯"山东省第三届ACM大学生程序设计竞赛--n a^o7 ! 分类: 比赛 2015-06-09 17:16 14人阅读 评论(0) 收藏

    n a^o7 ! Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 All brave and intelligent fighte ...

  9. 山东省第五届ACM省赛

    题目链接:http://acm.sdut.edu.cn/sdutoj/contest_show.php?contest_id=1449 相关总结:http://www.cnblogs.com/mcfl ...

随机推荐

  1. android dimens 读取 px&dp问题

    1.dimens.xml文件:     <resources> <dimen name="area_margin_top">100dp</dimen& ...

  2. (转帖)BootStrap入门教程 (二)

    上讲回顾:Bootstrap的手脚架(Scaffolding)提供了固定(fixed)和流式(fluid)两种布局,它同时建立了一个宽达940px和12列的格网系统. 基于手脚架(Scaffoldin ...

  3. jquery导航动画

    经常在网上看到的,鼠标在导航上移动时,导航底部的横条会自动移动到鼠标悬浮的导航项上. 效果如下图: 利用jquery的 animate 函数,很好实现.代码很简单! 代码如下: <!DOCTYP ...

  4. WPF拖到、移动控件

    只需2个事件和一个point变量即可: Point mouse_offset = , ); void TC_MouseLeftButtonDown(object sender, MouseButton ...

  5. Discuz!NT 3.9.913 Beta DIY过程

    前提: 论坛的源码版本为dnt_3.9.913_sqlserver_beta.zip,以下例子都以这个版本为原型修改 dnt_3.9.913数据字典:下载 目前(2013年10月21日)官网的asp. ...

  6. 黄聪:查看mysql数据库真正的data目录

    终于找到了mysql数据库data目录在哪里! 用show variables like 'datadir',可查看真正的data目录 原文:http://blog.csdn.net/dmz1981/ ...

  7. TCP非阻塞通信

    一.SelectableChannel SelectableChannel支持阻塞和非阻塞模式的channel 非阻塞模式下的SelectableChannel,读写不会阻塞 SelectableCh ...

  8. SecureCRT自动记录日志【记录键入的所有命令和打印的结果信息】

  9. 配置文件——WebApp.config文件读取和修改

    using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using ...

  10. Linux使用笔记: 定制core dump文件的文件名

    在开发过程中,当一个Linux程序异常退出时,我们可以通过core文件来分析它异常的详细原因.缺省情况下,Linux在程序异常时不产生core文件,要想让程序异常退出时产生core dump文件,需要 ...