Tinkoff Challenge - Elimination Round 部分解题报告

A.

如果存在的话,一定是所有的数化为最初的最小值,如果做不到就不可以。

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <cstdio>
 6 #include <cmath>
 7 #include <queue>
 8 #include <set>
 9 #include <map>
10 #include <list>
11 #include <stack>
12 #define mp make_pair
13 typedef long long ll;
14 typedef unsigned long long ull;
15 const int MAX=1e5+1000;
16 const int INF=1e9+5;
17 using namespace std;
18 typedef pair<int,int> pii;
19 int n,k;
20 int a[MAX];
21 ll an;
22 int main()
23 {
24     scanf("%d%d",&n,&k);
25     for(int i=1;i<=n;i++)
26         scanf("%d",&a[i]);
27     sort(a+1,a+1+n);
28     an=0;
29     for(int i=2;i<=n;i++)
30     {
31         if((a[i]-a[1])%k)
32         {
33             printf("-1\n");return 0;
34         }
35         else
36         {
37             an+=(long long)((a[i]-a[1])/k);
38         }
39     }
40     cout<<an<<"\n";
41 }

B.

最基础的BFS迷宫(类似于连连看那道题)

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <cstdio>
 6 #include <cmath>
 7 #include <queue>
 8 #include <set>
 9 #include <map>
10 #include <list>
11 #include <stack>
12 #define mp make_pair
13 typedef long long ll;
14 typedef unsigned long long ull;
15 const int MAX=1e3+5;
16 const int INF=1e9+5;
17 using namespace std;
18 typedef pair<int,int> pii;
19 int n,m;
20 char a[MAX][MAX];
21 int ci[MAX][MAX];
22 int dx[4]={0,0,1,-1};
23 int dy[4]={1,-1,0,0};
24 bool val(int x,int y)
25 {
26     if(x<=0||y<=0||x>n||y>m||a[x][y]==‘*‘)
27         return false;
28     return true;
29 }
30 bool df(int sx,int sy,int dir,int cis)
31 {
32     if(cis>2||(ci[sx][sy]!=-1&&ci[sx][sy]<=cis))
33         return false;
34     ci[sx][sy]=cis;
35     if(a[sx][sy]==‘T‘)
36         return true;
37     int cc;
38     int tx,ty;
39     for(int i=0;i<4;i++)
40     {
41         tx=sx+dx[i];ty=sy+dy[i];
42         if(i==dir)
43             cc=cis;
44         else
45             cc=cis+1;
46         if(cc>2)
47             continue;
48         if(val(tx,ty))
49         {
50             if(ci[tx][ty]!=-1&&ci[tx][ty]<=cc)
51                 continue;
52             if(df(tx,ty,i,cc))
53                 return true;
54         }
55     }
56     return false;
57 }
58 bool dfs(int sx,int sy)
59 {
60     ci[sx][sy]=0;
61     int tx,ty;
62     for(int i=0;i<4;i++)
63     {
64
65         tx=sx+dx[i];ty=sy+dy[i];
66         if(val(tx,ty))
67         {
68                 memset(ci,-1,sizeof(ci));ci[sx][sy]=0;
69 //            printf("~~\n");
70             if(df(tx,ty,i,0))
71                 return true;
72         }
73     }
74     return false;
75 }
76 int main()
77 {
78     scanf("%d%d",&n,&m);
79 //    memset(ci,-1,sizeof(ci));
80     for(int i=1;i<=n;i++)
81         scanf("%s",a[i]+1);
82     for(int i=1;i<=n;i++)
83     {
84         for(int j=1;j<=m;j++)
85             if(a[i][j]==‘S‘)
86         {
87             if(dfs(i,j))
88                 printf("YES\n");
89             else
90                 printf("NO\n");
91         }
92     }
93 }

D.

(n+m)*n^2*k的做法写得好一点也可以勉强卡过,这里只写(n+m)*n*k的。

a[x][y][z]分别表示当下在的位置,所走的方向尽头的坐标(不可以到达),第几个(从大往小写,到1截至)

进行记忆化处理,例如[l,r]假设从l走到某个位置t后,可以走[l,t],或[t,r],并且选择了某个区间以后一定就都在这个区间里。依照此想法递归即可。

 1 #include <string>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <iostream>
 6 #include <cmath>
 7 #include <queue>
 8 #include <set>
 9 #include <map>
10 #include <list>
11 #include <stack>
12 #define mp make_pair
13 #define Min(a,b) a<b?a:b
14 typedef long long ll;
15 typedef unsigned long long ull;
16 const int MAX=82;
17 const int INF=1e9+5;
18 using namespace std;
19 typedef pair<int,int> pii;
20 int a[MAX][MAX][MAX];
21 int dis[MAX][MAX];
22 int n,k,m;
23 int u,v,c;
24 int dp(int x,int y,int knum,int st)
25 {
26     if(a[x][y][knum]!=-1)
27         return a[x][y][knum];
28     if(knum==1)
29         return a[x][y][knum]=0;
30     int re=INF;
31     if(st)
32     {
33         for(int i=y+1;i<x;i++)
34         {
35             if(dis[x][i]!=INF)
36             {
37                 re=Min(re,dis[x][i]+dp(i,x,knum-1,0));
38                 re=Min(re,dis[x][i]+dp(i,y,knum-1,1));
39             }
40         }
41     }
42     else
43     {
44         for(int i=x+1;i<y;i++)
45         {
46             if(dis[x][i]!=INF)
47             {
48                 re=Min(re,dis[x][i]+dp(i,x,knum-1,1));
49                 re=Min(re,dis[x][i]+dp(i,y,knum-1,0));
50             }
51         }
52     }
53     return a[x][y][knum]=re;
54 }
55 int main()
56 {
57     scanf("%d%d",&n,&k);
58     scanf("%d",&m);
59     int an=INF;
60     for(int i=0;i<=n+1;i++)
61         for(int j=0;j<=n+1;j++)
62             dis[i][j]=INF;
63     memset(a,-1,sizeof(a));
64     while(m--)
65     {
66         scanf("%d%d%d",&u,&v,&c);
67         dis[u][v]=Min(dis[u][v],c);
68     }
69     for(int i=1;i<=n;i++)
70     {
71         an=Min(an,dp(i,0,k,1));
72         an=Min(an,dp(i,n+1,k,0));
73     }
74     if(an==INF)
75         printf("-1\n");
76     else
77         printf("%d\n",an);
78 }

时间: 2024-08-06 20:02:13

Tinkoff Challenge - Elimination Round 部分解题报告的相关文章

hacker cup 2015 Round 1 解题报告

A:求区间内素因子个数等于n的数有多少个 解题思路:筛法 解题代码: 1 // File Name: a.cpp 2 // Author: darkdream 3 // Created Time: 2015年01月18日 星期日 13时54分20秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include&

BestCoder Round #75 解题报告

1.King's Cake #include<stdio.h> #include<iostream> using namespace std; int ans; void solve(int l,int w) { if(weight == 0||weight == 0) return 0; int t,tl,tw; t = l/w; ans += t; tw = w; w = l%w; l = tw; solve(l,w); } int main(void) { int lengt

Intel Code Challenge Elimination Round (Div.1 + Div.2, combined)C. Destroying Array(想法题)

传送门 Description You are given an array consisting of n non-negative integers a1, a2, ..., an. You are going to destroy integers in the array one by one. Thus, you are given the permutation of integers from 1 to n defining the order elements of the ar

Intel Code Challenge Elimination Round (Div.1 + Div.2, combined)(set容器里count函数以及加强for循环)

题目链接:http://codeforces.com/contest/722/problem/D 1 #include <bits/stdc++.h> 2 #include <iostream> 3 #include <queue> 4 #include <stdio.h> 5 #include <string.h> 6 #include <algorithm> 7 #include <string> 8 #include

BestCoder Round #86 解题报告

A.Price List Sol 求和查询 Code #include<cstdio> #include<algorithm> #include<iostream> using namespace std; typedef long long LL; const int N = 100005; //LL v[N]; inline LL in(LL x=0,char ch=getchar()){ while(ch>'9'||ch<'0') ch=getchar

CF round #292 解题报告

A题: 给出一个坐标(a,b),和走的步数,问有没有可能从(0,0)走这么多步刚好到达(a,b). 水题,结果还是wa了一次,没有考虑到a<0或者b<0的情况. 1 #include<cstdio> 2 int main() 3 { 4 int a,b,s; 5 while(scanf("%d%d%d",&a,&b,&s)!=EOF){ 6 if(a<0) 7 a=-a; 8 if(b<0) 9 b=-b; 10 if(a+b

POJ 2942.Knights of the Round Table 解题报告

简要题解: 意在判断哪些点在一个图的  奇环的双连通分量内. tarjan求出所有的点双连通分量,再用二分图染色判断每个双连通分量是否形成了奇环,记录哪些点出现在内奇环内 输出没有在奇环内的点的数目 coder /* 求有向图的点双连通分支tarjan算法 思路: 1.对图先进行深度优先搜索形成搜索数,计算每一个节点的先深编号dfn[n] 2.计算所有节点v的low[v]是在先深生成树上按照后根遍历的顺序进行的. 因此,当仿问节点v时它的每一个儿子u的low[u]已经计算完毕这时low[v]取下

【贪心】【multiset】Tinkoff Challenge - Final Round (Codeforces Round #414, rated, Div. 1 + Div. 2) C. Naming Company

考虑两个人,先把各自的集合排个序,丢掉一半,因为比较劣的那一半一定用不到. 然后贪心地放,只有两种决策,要么把一个最优的放在开头,要么把一个最劣的放在结尾. 如果我的最优的比对方所有的都劣(或等于),我就把我最劣的往结尾放.否则我把我最优的往开头放. 用multiset维护两人的集合即可. #include<cstdio> #include<cstring> #include<algorithm> #include<set> using namespace

Intel Code Challenge Elimination Round (Div.1 + Div.2, combined)

A题,水题,不过我写的时候少考虑了一个细节导致WA了一发. B题,水题,判断一行内元音字母的个数是不是等于p[i]即可. C题,好题,反过来思考,用并查集离线处理.每次如果能合并就合并并更新答案即可.代码如下: 1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 #include <iostream> 5 #include <queue> 6 using name