Codeforces Round #592 (Div. 2)
A. Pens and Pencils
题目链接:https://codeforces.com/contest/1244/problem/A
题意:
给定五个数 a , b , c , d , k
求一对 x , y 使得 cx >= a , dy >= b , 且 x + y <= k
若无法找到满足条件的 x , y ,则输出 - 1
分析:
判断 a 是否能除尽 c , 如果能 , 则 x 最小可以为 c / a , 否则 x 最小可以为 a / c + 1
再判断 b 是否能除尽 d , 如果能 , 则 y 最小可以为 d / b , 否则 y 最小可以为 b / d + 1
然后再判断 x + y <= k 是否成立即可
- #include<bits/stdc++.h>
- #define ios std::ios::sync_with_stdio(false) , std::cin.tie(0) , std::cout.tie(0)
- #define sd(n) scanf("%d",&n)
- #define sdd(n,m) scanf("%d%d",&n,&m)
- #define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k)
- #define pd(n) printf("%d\n", (n))
- #define pdd(n,m) printf("%d %d\n", n, m)
- #define pld(n) printf("%lld\n", n)
- #define pldd(n,m) printf("%lld %lld\n", n, m)
- #define sld(n) scanf("%lld",&n)
- #define sldd(n,m) scanf("%lld%lld",&n,&m)
- #define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)
- #define sf(n) scanf("%lf",&n)
- #define sff(n,m) scanf("%lf%lf",&n,&m)
- #define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)
- #define rep(i,a,n) for (int i=a;i<=n;i++)
- #define per(i,n,a) for (int i=n;i>=a;i--)
- #define mm(a,n) memset(a, n, sizeof(a))
- #define pb push_back
- #define all(x) (x).begin(),(x).end()
- #define fi first
- #define se second
- #define ll long long
- #define numm ch - 48
- #define MOD 1000000007
- #define INF 0x3f3f3f3f
- #define pi 3.14159265358979323
- #define debug(x) cout << #x << ": " << x << endl
- #define debug2(x, y) cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<< endl;
- #define debug3(x, y, z) cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl;
- #define debug4(a, b, c, d) cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl;
- using namespace std;
- template<typename T>void read(T &res){bool flag=false;char ch;while(!isdigit(ch=getchar()))(ch=='-')&&(flag=true);
- for(res=numm;isdigit(ch=getchar());res=(res<<)+(res<<)+numm);flag&&(res=-res);}
- template<typename T>void Out(T x){if(x<)putchar('-'),x=-x;if(x>)Out(x/);putchar(x%+'');}
- ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
- ll lcm(ll a,ll b){return a*b/gcd(a,b);}
- ll pow_mod(ll x,ll n,ll mod){ll res=;while(n){if(n&)res=res*x%mod;x=x*x%mod;n>>=;}return res;}
- ll fact_pow(ll n,ll p){ll res=;while(n){n/=p;res+=n;}return res;}
- bool isPrime(ll n)
- {ll i,t;if(n==||n==)return ;if(n%!=&&n%!=)return ;t=sqrt(n);for(i=;i<=t;i+=)if(n%i==||n%(i+)==)return ;return ;}
- const int N = 2e5 + ;
- int a , b, c , d ,k;
- int main()
- {
- ios;
- int t;
- cin >> t;
- int ans1 , ans2 ;
- while(t--)
- {
- cin >> a >> b >> c >> d >> k;
- if(a % c == ) ans1 = a / c;
- else ans1 = a / c + ;
- if(b % d == ) ans2 = b / d;
- else ans2 = b / d + ;
- if(ans1 + ans2 <= k)
- cout << ans1 << " " << ans2 << endl;
- else cout << - << endl;
- }
- return ;
- }
B. Rooms and Staircases
题目链接:https://codeforces.com/contest/1244/problem/B
题意:
有一个两层的房子,每层有 n 间屋子,每层的相邻两个屋子可以到达。两层之间有一些屋子有楼梯相连。
现在你可以选择从任意一间屋子出发 , 问在不走已经走过的屋子的前提下 , 你最多能走过多少间屋子
分析:
要想走更多的屋子, 肯定要从某一层的第一列或者最后一列出发
所以我们只要找所有楼梯距离第一列和最后一列的最大距离 max , 然后答案就是 2 * max
- #include<bits/stdc++.h>
- #define ios std::ios::sync_with_stdio(false) , std::cin.tie(0) , std::cout.tie(0)
- #define sd(n) scanf("%d",&n)
- #define sdd(n,m) scanf("%d%d",&n,&m)
- #define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k)
- #define pd(n) printf("%d\n", (n))
- #define pdd(n,m) printf("%d %d\n", n, m)
- #define pld(n) printf("%lld\n", n)
- #define pldd(n,m) printf("%lld %lld\n", n, m)
- #define sld(n) scanf("%lld",&n)
- #define sldd(n,m) scanf("%lld%lld",&n,&m)
- #define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)
- #define sf(n) scanf("%lf",&n)
- #define sff(n,m) scanf("%lf%lf",&n,&m)
- #define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)
- #define rep(i,a,n) for (int i=a;i<=n;i++)
- #define per(i,n,a) for (int i=n;i>=a;i--)
- #define mm(a,n) memset(a, n, sizeof(a))
- #define pb push_back
- #define all(x) (x).begin(),(x).end()
- #define fi first
- #define se second
- #define ll long long
- #define numm ch - 48
- #define MOD 1000000007
- #define INF 0x3f3f3f3f
- #define pi 3.14159265358979323
- #define debug(x) cout << #x << ": " << x << endl
- #define debug2(x, y) cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<< endl;
- #define debug3(x, y, z) cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl;
- #define debug4(a, b, c, d) cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl;
- using namespace std;
- template<typename T>void read(T &res){bool flag=false;char ch;while(!isdigit(ch=getchar()))(ch=='-')&&(flag=true);
- for(res=numm;isdigit(ch=getchar());res=(res<<)+(res<<)+numm);flag&&(res=-res);}
- template<typename T>void Out(T x){if(x<)putchar('-'),x=-x;if(x>)Out(x/);putchar(x%+'');}
- ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
- ll lcm(ll a,ll b){return a*b/gcd(a,b);}
- ll pow_mod(ll x,ll n,ll mod){ll res=;while(n){if(n&)res=res*x%mod;x=x*x%mod;n>>=;}return res;}
- ll fact_pow(ll n,ll p){ll res=;while(n){n/=p;res+=n;}return res;}
- bool isPrime(ll n)
- {ll i,t;if(n==||n==)return ;if(n%!=&&n%!=)return ;t=sqrt(n);for(i=;i<=t;i+=)if(n%i==||n%(i+)==)return ;return ;}
- const int N = 2e5 + ;
- int main()
- {
- int t;
- cin >> t;
- while(t--)
- {
- int n;
- cin >> n;
- string s;
- cin >> s;
- int minn = INF , maxn = -;
- int len = s.size();
- rep(i , , len - )
- {
- if(s[i] == '')
- {
- if(minn > i )
- minn = i;
- if(maxn < i + )
- maxn = i + ;
- }
- }
- if(minn == INF)
- {
- cout << n << endl;
- continue;
- }
- int ans = max(maxn , n - minn);
- cout << ans * << endl;
- }
- return ;
- }
C. The Football Season
题目链接:https://codeforces.com/contest/1244/problem/C
题意:
踢足球。 已知你进行了 N 场比赛 , 你的总得分为 P , 赢一场比赛加 w 分 , 平局加 d 分 , 输了不掉分(w > d)
现在你忘了你赢了多少场 , 平局了多少场 , 输了多少场 , 于是你要求出任意一组 x (胜场), y (平场), z(输场)
使得 x * w + y * d = N , x + y + z = P;
分析:
直接暴力枚举平局的场次就可以了 ,平局的场次最多为 lcm(w , d) / d - 1
因为当平局场次达到 lcm(w , d) / d 的时候 , 平局带来的分数为 lcm(w , d) / d * d , 而它等于 lcm(w , d) / w * w
即它可以转换成胜利了 lcm(w , d) / w 场 , 所以我们只要在枚举平局场次y的同时判断是否有满足条件的x即可
- #include<bits/stdc++.h>
- #define ios std::ios::sync_with_stdio(false) , std::cin.tie(0) , std::cout.tie(0)
- #define sd(n) scanf("%d",&n)
- #define sdd(n,m) scanf("%d%d",&n,&m)
- #define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k)
- #define pd(n) printf("%d\n", (n))
- #define pdd(n,m) printf("%d %d\n", n, m)
- #define pld(n) printf("%lld\n", n)
- #define pldd(n,m) printf("%lld %lld\n", n, m)
- #define sld(n) scanf("%lld",&n)
- #define sldd(n,m) scanf("%lld%lld",&n,&m)
- #define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)
- #define sf(n) scanf("%lf",&n)
- #define sff(n,m) scanf("%lf%lf",&n,&m)
- #define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)
- #define rep(i,a,n) for (int i=a;i<=n;i++)
- #define per(i,n,a) for (int i=n;i>=a;i--)
- #define mm(a,n) memset(a, n, sizeof(a))
- #define pb push_back
- #define all(x) (x).begin(),(x).end()
- #define fi first
- #define se second
- #define ll long long
- #define numm ch - 48
- #define MOD 1000000007
- #define pi 3.14159265358979323
- #define lrt rt<<1
- #define rrt rt<<1|1
- #define lson l, m, lrt
- #define rson m+1, r, rrt
- #define debug(x) cout << #x << ": " << x << endl
- #define debug2(x, y) cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<< endl;
- #define debug3(x, y, z) cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl;
- #define debug4(a, b, c, d) cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl;
- using namespace std;
- const ll INF (0x3f3f3f3f3f3f3f3fll);
- template<typename T>void read(T &res){bool flag=false;char ch;while(!isdigit(ch=getchar()))(ch=='-')&&(flag=true);
- for(res=numm;isdigit(ch=getchar());res=(res<<)+(res<<)+numm);flag&&(res=-res);}
- template<typename T>void Out(T x){if(x<)putchar('-'),x=-x;if(x>)Out(x/);putchar(x%+'');}
- ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
- ll lcm(ll a,ll b){return a*b/gcd(a,b);}
- ll pow_mod(ll x,ll n,ll mod){ll res=;while(n){if(n&)res=res*x%mod;x=x*x%mod;n>>=;}return res;}
- ll fact_pow(ll n,ll p){ll res=;while(n){n/=p;res+=n;}return res;}
- ll mult_mod(ll a, ll b, ll c)
- {a%=c;b%=c;ll ret=,tmp=a;while(b){if(b&){ret+=tmp;if(ret>c)ret-=c;}tmp<<=;if(tmp>c)tmp-=c;b>>=;}return ret;}
- bool check(ll a, ll n, ll x, ll t)
- {ll v=pow_mod(a,x,n);ll s=v;rep(i,,t){v=mult_mod(v,v,n);if(v==&&s!=&&s!=n-)return true;s=v;}
- if(v!=)return true;else return false;}
- bool Miller_Rabin(ll n)
- {if(n<)return false;if(n==)return true;if((n&)==)return false;ll x=n-,t=;while((x&)==){x>>=;t++;}srand(time(NULL));
- rep(i,,){ll a=rand()%(n-)+;if(check(a,n,x,t))return false;}return true;}
- const int N = 2e5 + ;
- int main()
- {
- ios;
- ll n , p , w , d;
- cin >> n >> p >> w >> d;
- ll tot = lcm(w , d);
- tot /= d;
- tot -= ;
- for(int i = ; i <= tot && i <= n ; i ++)
- {
- ll win;
- ll he = p - d * i;
- if(he % w == && he >= )
- {
- win = he / w;
- if(win + i <= n)
- {
- cout << win << " " << i << " " << n - win - i << '\n';
- return ;
- }
- }
- }
- puts("-1");
- return ;
- }
D. Paint the Tree
题目链接:https://codeforces.com/contest/1244/problem/D
题意:
给定三种不同颜色的染料和一颗有 n 个节点的树 , 然后让你给树上色
要求每三个相邻节点的颜色不同 , 每个节点染上不同的颜色都有相应的费用 , 求最小花费
分析:
不难发现只有当这颗树为一条链的时候才能合法染色 , 且前两个节点的颜色确定了后剩下节点的颜色也就都确定了
所以我们只要枚举前两个节点的颜色 , 然后计算所有花费中的最小花费即可
- #include<bits/stdc++.h>
- #define ios std::ios::sync_with_stdio(false) , std::cin.tie(0) , std::cout.tie(0)
- #define sd(n) scanf("%d",&n)
- #define sdd(n,m) scanf("%d%d",&n,&m)
- #define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k)
- #define pd(n) printf("%d\n", (n))
- #define pdd(n,m) printf("%d %d\n", n, m)
- #define pld(n) printf("%lld\n", n)
- #define pldd(n,m) printf("%lld %lld\n", n, m)
- #define sld(n) scanf("%lld",&n)
- #define sldd(n,m) scanf("%lld%lld",&n,&m)
- #define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)
- #define sf(n) scanf("%lf",&n)
- #define sff(n,m) scanf("%lf%lf",&n,&m)
- #define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)
- #define rep(i,a,n) for (int i=a;i<=n;i++)
- #define per(i,n,a) for (int i=n;i>=a;i--)
- #define mm(a,n) memset(a, n, sizeof(a))
- #define pb push_back
- #define all(x) (x).begin(),(x).end()
- #define fi first
- #define se second
- #define ll long long
- #define numm ch - 48
- #define MOD 1000000007
- #define pi 3.14159265358979323
- #define debug(x) cout << #x << ": " << x << endl
- #define debug2(x, y) cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<< endl;
- #define debug3(x, y, z) cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl;
- #define debug4(a, b, c, d) cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl;
- using namespace std;
- const ll INF (0x3f3f3f3f3f3f3f3fll);
- template<typename T>void read(T &res){bool flag=false;char ch;while(!isdigit(ch=getchar()))(ch=='-')&&(flag=true);
- for(res=numm;isdigit(ch=getchar());res=(res<<)+(res<<)+numm);flag&&(res=-res);}
- template<typename T>void Out(T x){if(x<)putchar('-'),x=-x;if(x>)Out(x/);putchar(x%+'');}
- ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
- ll lcm(ll a,ll b){return a*b/gcd(a,b);}
- ll pow_mod(ll x,ll n,ll mod){ll res=;while(n){if(n&)res=res*x%mod;x=x*x%mod;n>>=;}return res;}
- ll fact_pow(ll n,ll p){ll res=;while(n){n/=p;res+=n;}return res;}
- bool isPrime(ll n)
- {ll i,t;if(n==||n==)return ;if(n%!=&&n%!=)return ;t=sqrt(n);for(i=;i<=t;i+=)if(n%i==||n%(i+)==)return ;return ;}
- const ll N = 1e5 + ;
- pair<ll , ll>haha;
- vector<ll>v[N] ;
- vector<pair<ll , ll>>v1[N];
- ll ans , ans1 = INF;
- ll col[][N] , n , luxie[N];
- bool vis[N];
- bool cmp(pair<ll ,ll>a , pair<ll ,ll> b)
- {
- return a.first < b.first;
- }
- int main()
- {
- cin >> n;
- rep(i , , )
- rep(j , , n)
- cin >> col[i][j];
- rep(i , , n - )
- {
- ll x , y;
- cin >> x >> y;
- v[x].pb(y) , v[y].pb(x);
- }
- rep(i , , n) if(v[i].size() > )
- {
- cout << - << endl;
- return ;
- }
- ll tot = , num;
- rep(i , , )
- {
- mm(vis , );
- ll flag = , last , k = i , ans = , num1 = ;
- rep(j , , n)
- {
- if(v[j].size() == )
- {
- haha.first = j , haha.second = k;
- v1[tot].pb(haha);
- ans += col[k % ][j];
- vis[j] = ;
- flag = ;
- k ++ , num1 ++;
- last = v[j][];
- break;
- }
- }
- while(num1 < n)
- {
- haha.first = last , haha.second = k % ;
- v1[tot].pb(haha);
- ans += col[k % ][last] , vis[last] = ;
- rep(h , , v[last].size() - )
- if(!vis[v[last][h]]){last = v[last][h] ; break ;}
- k++ , num1 ++;
- }
- if(ans1 > ans) ans1 = ans , num = tot;
- tot ++;
- }
- rep(i , , )
- {
- mm(vis , );
- ll flag = , last , k = i , ans = , num1 = ;
- rep(j , , n)
- {
- if(v[j].size() == )
- {
- haha.first = j , haha.second = k;
- num1 ++;
- ans += col[k % ][j];
- v1[tot].pb(haha);
- k += ;
- vis[j] = ;
- flag = ;
- last = v[j][];
- break;
- }
- }
- while(num1 < n)
- {
- haha.first = last , haha.second = k % ;
- ans += col[k % ][last] , vis[last] = ;
- v1[tot].pb(haha);
- rep(h , , v[last].size() - )
- if(!vis[v[last][h]]){last = v[last][h] ; break ;}
- k += ; num1 ++;
- }
- if(ans1 > ans) ans1 = ans , num = tot;
- tot ++;
- }
- cout << ans1 << endl;
- sort(v1[num].begin() , v1[num].end() , cmp);
- rep(i , , v1[num].size() - )
- cout << v1[num][i].second + << " ";
- cout << v1[num][v1[num].size() - ].second + << endl;
- return ;
- }
Codeforces Round #592 (Div. 2)的更多相关文章
- Codeforces Round #592 (Div. 2) D - Paint the Tree
题目链接:https://codeforces.com/contest/1244/problem/D 题意:给你一个树,让你把树上的每个节点染成三种颜色,使得任意三个互相相邻的节点颜色都不一样(意思是 ...
- Codeforces Round #592 (Div. 2)【C题】{补题ING}
思路:x,y,z肯定不为负数xw+dy=p,直接枚举系数较小的y即可,y的范围:y<w,因为大于w的时候,不如去增加x,这样x+y的和还能保持尽可能小. /* x*w+y*d=p; x*w+(K ...
- Codeforces Round #592 (Div. 2) E
给你一个数组,你最多可以进行k次操作,每次操作可以使一个数+1或者-1,问操作之后数组的极差最小可能是多少 利用map来模拟移动,可以观察到每次应该选择数量少的一组数让他们进行移动是最优的 int m ...
- Codeforces Round #592 (Div. 2)G(模拟)
#define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;long long a[1000007],b[ ...
- Codeforces Round #366 (Div. 2) ABC
Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...
- Codeforces Round #354 (Div. 2) ABCD
Codeforces Round #354 (Div. 2) Problems # Name A Nicholas and Permutation standard input/out ...
- Codeforces Round #368 (Div. 2)
直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
- Codeforces Round #279 (Div. 2) ABCDE
Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name A Team Olympiad standard input/outpu ...
随机推荐
- uniapp打包Android APP
1.uniAPP 将项目打包成,打包成功后格式如下 2.下载相关工具 Android studio(打包成app的工具) 和Hbuilder官方SDK,安装解压响应工具 3. 用 Android st ...
- Kibana创建索引成功,但一直不显示出来(Fielddata is disabled on text fields by default. Set fielddata=true........)
现象 把EFK整个集群搭建完成后,通过Kibana操作界面创建索引(如图1),我创建了lile-zabbix*的索引,显示是创建成功了,但是只要我在重新刷新一次,已经创建的索引就“消失了”.后通过查看 ...
- 扛把子组作业要求 20191024-3 互评Alpha阶段作品
此作业的要求参见[https://edu.cnblogs.com/campus/nenu/2019fall/homework/9860] 组名:扛把子 组长:迟俊文 组员:宋晓丽 梁梦瑶 韩昊 刘信鹏 ...
- UCloud 云服务内容审核 Java 版本实现
前言 最近不少小伙伴反映上传小黄图偶尔性的异常,并且不能上传动态图片,很是苦恼!无她,鉴黄API还没有这么智能,毕竟是自己训练的,不是那么专业!为了更好的服务广大网友,撸主决定接入更加智能快速的鉴黄服 ...
- css控制ul标签下的指定li标签样式
ul li:first-child{ } 第一个ul li:last-child{ } 最后一个ul li:nth-child(4){ } 指定第几个,4就是代表第四个ul li:nth-chi ...
- 实战webpack系列说明
01.概念股 本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler). 当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(d ...
- typedef & #defiine & struct
#define(宏定义)只是简单的字符串代换(原地扩展),它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了. typedef是为了增加可读性而为标识符另起的新名称(仅仅只是个别名), ...
- HUB-交换机-路由器
HUB集线器-物理层 工作原理: 机器1发送一个数据(广播发送),经过集线器hub,hub会转发到其他所有机器,其他机器接收到数据,如果数据是给自己的就收下,如果不是自己的就丢弃 集线器的作用?(su ...
- 利用scatter()绘制颜色映射的二次方曲线
程序如下: import matplotlib.pyplot as plt x_value = list(range(1, 1001)) y_value = [x**2 for x in x_valu ...
- __getattribute__(self, obj) 这个方法中的obj这个参数
class Itcast(object): def __init__(self, subject1): self.subject1 = subject1 print("^^^^^^^---- ...