博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #287 (Div. 2) ABCDE
阅读量:6876 次
发布时间:2019-06-26

本文共 7611 字,大约阅读时间需要 25 分钟。

A题。。

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 8 using namespace std; 9 10 #define LL long long11 #define eps 1e-812 #define inf 0x3f3f3f3f13 #define lson l, m, rt << 114 #define rson m+1, r, rt << 1 | 115 #define mnx 50016 17 struct node{18 int v, id;19 bool operator < ( const node &b ) const {20 return v < b.v;21 }22 }a[mnx];23 int b[mnx];24 int main(){25 int n, k;26 scanf( "%d %d", &n, &k );27 for( int i = 1; i <= n; ++i ){28 scanf( "%d", &a[i].v );29 a[i].id = i;30 }31 sort( a + 1, a + 1 + n );32 int i = 1, ans = 0, sum = 0;33 while( sum + a[i].v <= k && i <= n ){34 b[ans++] = a[i].id, sum += a[i++].v;35 }36 printf( "%d\n", ans );37 for( i = 0; i < ans; ++i )38 printf( "%d ", b[i] );39 return 0;40 }
View Code

B题。。注意有可能 爆int

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 8 using namespace std; 9 10 #define LL long long11 #define eps 1e-812 #define inf 0x3f3f3f3f13 #define lson l, m, rt << 114 #define rson m+1, r, rt << 1 | 115 #define mnx 50016 17 int main(){18 double r, x, y, xx, yy;19 scanf( "%lf%lf%lf%lf%lf", &r, &x, &y, &xx, &yy );20 double dis = sqrt( ( xx - x ) * ( xx - x ) + ( yy - y ) * ( yy - y ) );21 int ans = ceil( dis / 2 / r );22 cout << ans << endl;23 }
View Code

C题。。把它当做一棵满二叉树来看,根节点是1,然后第二层是2,3, 第三层是4,5,6,7。。先计算出第h层第n个节点在整个满二叉树是第cur个,然后一直向上得到父亲节点,一直到根节点。。计算的话,因为是LRLRLR这样走的,如果a[i+1] %2 == a[i]%2的话,就要加上某一边的子树的所有节点b[h+1-i],不同的话就直接ans++就好。。具体自己画图加结合代码理解一下

1 include 
2 #include
3 #include
4 #include
5 #include
6 7 using namespace std; 8 9 #define LL long long10 #define eps 1e-811 #define inf 0x3f3f3f3f12 #define lson l, m, rt << 113 #define rson m+1, r, rt << 1 | 114 #define mnx 50015 16 LL a[mnx], b[mnx];17 int main(){18 LL h, n;19 cin >> h >> n;20 LL L = 1;21 for( int i = 0; i < h; ++i )22 L <<= 1;23 b[0] = 1;24 for( int i = 1; i <= h; ++i )25 b[i] = b[i-1] * 2;26 LL cur = L + n - 1;27 int m = h + 1;28 while( cur ){29 a[m--] = cur;30 cur >>= 1;31 }32 LL ans = 0;33 for( int i = 1; i < h+1; ++i ){34 if( a[i+1] % 2 == a[i] % 2 )35 ans += b[h+1-i];36 else ans++;37 }38 cout << ans << endl;39
View Code

D题。。不会,数位dp,复制别人的题解

给定n,k,m

求有多少个恰好为n位的整数,且这个整数的某个后缀能整除k,答案模m

思路:

因为是求后缀,所以从低位往高位构造。

dp[i][j][0] 表示长度为i位的整数,模k结果为j,且不存在某个后缀能整除k的个数

dp[i][j][1] 表示长度为i位的整数,模k结果为j,且存在某个后缀能整除k的个数

然后转移就在某个状态前加一个数字,判断一下加上后能否被k整除来决定加上数字后到达的状态

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 10 using namespace std;11 12 #define LL long long13 #define eps 1e-814 #define inf 0x3f3f3f3f15 #define lson l, m, rt << 116 #define rson m+1, r, rt << 1 | 117 #define mnx 105018 19 LL dp[mnx][120][2], len[mnx], mod;20 int n, k;21 void add( LL &x, LL y ){22 x = ( x + y ) % mod;23 }24 int main(){25 cin >> n >> k >> mod;26 dp[0][0][0] = 1, len[0] = 1;27 for( int i = 1; i < mnx; ++i )28 len[i] = len[i-1] * 10 % k;29 for( int i = 0; i < n; ++i ){30 for( int j = 0; j < k; ++j ){31 for( int v = 0; v < 10; ++v ){32 if( i == n-1 && !v ) continue;33 LL val = ( v * len[i] + j ) % k;34 if( !val && v )35 add( dp[i+1][0][1], dp[i][j][0] );36 else37 add( dp[i+1][val][0], dp[i][j][0] );38 add( dp[i+1][val][1], dp[i][j][1] );39 }40 }41 }42 LL ans = 0;43 for( int i = 0; i < k; ++i )44 ans = ( ans + dp[n][i][1] ) % mod;45 cout << ans << endl;46 return 0;47 }
View Code

E题。。最短路,感觉挺水的,把最短路上所有为0的边改为1,把不是最短路的边所有为1的变为0。。

表示自己的代码写的好挫。。

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 10 using namespace std; 11 12 #define LL long long 13 #define eps 1e-8 14 #define inf 0x3f3f3f3f 15 #define lson l, m, rt << 1 16 #define rson m+1, r, rt << 1 | 1 17 #define mnx 200500 18 19 int fst[mnx], nxt[mnx], vv[mnx], work[mnx], e, dis[mnx], sum[mnx], n, fa[mnx]; 20 bool vis[mnx]; 21 map< pair
, int > mp; 22 void add( int u, int v, int c ){ 23 vv[e] = v, nxt[e] = fst[u], work[e] = c, fst[u] = e++; 24 } 25 struct edge{ 26 int v, u, d; 27 edge(){} 28 edge( int u, int v, int d ) : u(u), v(v), d(d) {} 29 bool operator < ( const edge &b ) const { 30 return d > b.d; 31 } 32 }ee[mnx]; 33 void dij(){ 34 memset( fa, -1, sizeof fa ); 35 fa[1] = 1; 36 memset( dis, 0x3f, sizeof dis ); 37 priority_queue
q; 38 dis[1] = 0; 39 edge p; 40 p.u = 1, p.d = 0; 41 q.push( p ); 42 while( !q.empty() ){ 43 p = q.top(); q.pop(); 44 int u = p.u; 45 if( vis[u] ) continue; 46 vis[u] = 1; 47 for( int i = fst[u]; i != -1; i = nxt[i] ){ 48 int v = vv[i], w = work[i]; 49 if( dis[v] > dis[u] + 1 || ( dis[v] == dis[u] + 1 && sum[v] < sum[u] + w ) ){ 50 dis[v] = dis[u] + 1; 51 sum[v] = sum[u] + w; 52 edge pp; 53 pp.u = v, pp.d = dis[v]; 54 q.push( pp ); 55 fa[v] = u; 56 } 57 } 58 } 59 //cout << dis[n] << endl; 60 } 61 void dfs( int u ){ 62 vis[u] = 1; 63 if( fa[u] != u ){ 64 dfs( fa[u] ); 65 } 66 } 67 int main(){ 68 int m, all = 0; 69 scanf( "%d%d",&n, &m ); 70 memset( fst, -1, sizeof fst ); 71 for( int i = 0; i < m; ++i ){ 72 int u, v, c; 73 scanf( "%d%d%d", &u, &v, &c ); 74 add( u, v, c ); 75 add( v, u, c ); 76 ee[all++] = edge( u, v, c ); 77 ee[all++] = edge( v, u, c ); 78 } 79 dij(); 80 memset( vis, 0, sizeof vis ); 81 dfs( n ); 82 int ans = 0; 83 for( int i = 1; i <= n; ++i ){ 84 int u = i; 85 if( !vis[i] ){ 86 for( int j = fst[u]; j != -1; j = nxt[j] ){ 87 int v = vv[j]; 88 if( mp.find( make_pair( u, v ) ) == mp.end() && mp.find( make_pair( v, u ) ) == mp.end() ){ 89 if( work[j] ) ans++; 90 mp[make_pair(u,v)]++; 91 } 92 } 93 } 94 else{ 95 for( int j = fst[u]; j != -1; j = nxt[j] ){ 96 int v = vv[j]; 97 if( v == fa[u] ){ 98 if( !work[j] ) ans++; 99 mp[make_pair(u,v)]++;100 }101 }102 }103 }104 for( int i = 1; i <= n; ++i ){105 int u = i;106 if( vis[i] ){107 for( int j = fst[u]; j != -1; j = nxt[j] ){108 int v = vv[j];109 if( mp.find( make_pair(u,v) ) == mp.end() && mp.find( make_pair(v,u) ) == mp.end() ){110 if( work[j] ) ans++;111 mp[make_pair(u,v)]++;112 }113 }114 }115 }116 cout << ans << endl;117 mp.clear();118 for( int i = 1; i <= n; ++i ){119 int u = i;120 if( !vis[i] ){121 for( int j = fst[u]; j != -1; j = nxt[j] ){122 int v = vv[j];123 if( mp.find( make_pair( u, v ) ) == mp.end() && mp.find( make_pair( v, u ) ) == mp.end() ){124 if( work[j] )125 printf( "%d %d %d\n", min(u,v),max(u,v), 0 );126 mp[make_pair(u,v)]++;127 }128 }129 }130 else{131 for( int j = fst[u]; j != -1; j = nxt[j] ){132 int v = vv[j];133 if( v == fa[u] ){134 if( !work[j] )135 printf( "%d %d %d\n", min(u,v),max(u,v), 1 );136 mp[make_pair(u,v)]++;137 }138 }139 }140 }141 for( int i = 1; i <= n; ++i ){142 int u = i;143 if( vis[i] ){144 for( int j = fst[u]; j != -1; j = nxt[j] ){145 int v = vv[j];146 if( mp.find( make_pair(u,v) ) == mp.end() && mp.find( make_pair(v,u) ) == mp.end() ){147 if( work[j] )148 printf( "%d %d %d\n", min(u,v),max(u,v), 0 );149 mp[make_pair(u,v)]++;150 }151 }152 }153 }154 return 0;155 }
View Code

 

转载于:https://www.cnblogs.com/LJ-blog/p/4254759.html

你可能感兴趣的文章
自定义nginx版本号
查看>>
感悟:周末实施
查看>>
Shell流程控制
查看>>
请在服务器管理器的 Tomcat 定制器中设置 manager-script 角色的正确用户名和口令。...
查看>>
SCCM TP4部署UWP应用之证书分发
查看>>
shell脚本工具之条件测试
查看>>
mysql 锁机制
查看>>
mongodb 3.0 配置
查看>>
2012年收获中带着无限感谢
查看>>
SANBoot安装系统
查看>>
《跟老男孩学Linux运维:核心基础实战》勘误与反馈
查看>>
【中级】华为设备VRRP双机双组热备配置实战
查看>>
实现JSP页面
查看>>
【iOS-cocos2d-X 游戏开发之十】自定义各类模版&触屏事件讲解!
查看>>
SCN浅析
查看>>
吐槽“云计算”
查看>>
使用Cocos2d-x-3.0游戏引擎编写一个塔防游戏1
查看>>
Exchange 2010和Exchange 2016共存部署-4:Exchange2016部署先决条件
查看>>
VSTO之旅系列(二):创建Excel解决方案
查看>>
SQL Server 2012笔记分享-3:版本对比
查看>>