Codeforces Round 1037(Div3)
第一次晚上打codeforces脑子转的就是比白天慢,写题速度明显慢了好多,有些都是碰运气刚好想到。div3依旧是思维题写完下班,只开了4个。E题虽然是思维题但是实在不想写了想了一会没想出来。前两天在hack,刚刚发现结算完毕了,俺也是有rating的人了~(图在后头)
A. Only One Digit
来源:Problem - A - Codeforces
思路
签到题,直接输出一串数字中最小的那个数就行
Code:
void solve()
{cin >>s;sort(s.begin(),s.end());cout << s[0] << endl;
}
B. No Casino in the Mountains
来源:Problem - B - Codeforces
思路
将所有好天气时间段存起来,对于每一段好天气,第一次是k天,后边都是k+1天,算算最多能访问多少峰数就行了
Code:
void solve()
{cin >> n >> m;priority_queue<int, vector<int>, greater<int>> q;q=priority_queue<int, vector<int>, greater<int>>();int x;int sum=0;for(int i=1; i<=n; i++){cin >> x;if(x==0)sum++;if(x==1||i==n){q.push(sum);sum=0;}}int cnt=0;while(!q.empty()){int f=q.top();if(f>=m){cnt++;f-=m;}cnt+=f/(m+1);q.pop();}cout << cnt << endl;
}
C. I Will Definitely Make It
思路
将比第k个平台高的平台高度存到最小堆里,一直判断它是否能在被淹到之前到达下一个平台就行了。
Code:
void solve()
{cin >> n >> m;priority_queue<int, vector<int>, greater<int>> q;q=priority_queue<int, vector<int>, greater<int>>();for(int i=1; i<=n; i++) cin >> a[i];for(int i=1; i<=n; i++){if(i==m||a[m]>=a[i]) continue;q.push(a[i]);}int yv=a[m];int ch=a[m];while(!q.empty()){int f=q.top();if(f-ch>yv){cout << "NO" << endl;return ;}ch=f;q.pop();}cout << "YES" << endl;
}
D. This Is the Last Time
思路
将每个赌场的l,r,real都存到结构体里并先后按照左边界、价值升序排序。遍历结构体,如果此时硬币数够这个区间且这个赌场的real值大于当前硬币数再进,最后就是能得到的最大值了。
Code:
struct p
{int l;int r;int val;
}k[N];
bool cmp(p a, p b)
{if(a.l!=b.l)return a.l<b.l;return a.val < b.val;
}
void solve()
{cin >> n >> m;for(int i=1; i<=n;i ++)cin >> k[i].l >> k[i].r >> k[i].val;sort(k+1,k+1+n,cmp);for(int i=1; i<=n; i++){if(m>=k[i].l&&m<k[i].val)m=k[i].val;}cout << m << endl;
}
E. G-C-D, Unlucky!
思路:
这道题在赛时没写出来,主要是对GCD的理解要深刻。对于主要部分,由题可得:
gcd(前i-1个元素的GCD, x[i]) = a[i]
gcd(x[i], 后n-i个元素的GCD) = b[i]
那么 此时的 x[i] 一定是他们的倍数,最小就是lcm(a[i],b[i]);
Code:
// *********************************************
// Problem: E. G-C-D, Unlucky!
// Contest: Codeforces - Codeforces Round 1037 (Div. 3)
// URL: https://codeforces.com/contest/2126/problem/E
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// *********************************************#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define fi first
#define se second
#define endl '\n'
const int N=1e5+5;
int a[N],b[N];//前缀、后缀GCDint lcm(int x,int y)//求最小公倍数
{int g=__gcd(x, y);int z=x*y/g;return z;
}void slove(){int n;cin>>n;for(int i=1;i<=n;i++)//前缀GCDcin>>a[i];for(int i=1;i<=n;i++)//后缀GCDcin>>b[i];if(a[n]!=b[1]){//都表示整个序列的GCDcout<<"NO"<<endl;return ;}for(int i=2;i<=n;i++){//随着数的增多那么GCD一定是非递增的if(a[i-1]<a[i]){cout<<"NO"<<endl;return;}}for(int i=2;i<=n;i++){if(b[i-1]>b[i]){cout<<"NO"<<endl;return;}}for(int i=1;i<=n;i++){int l=lcm(a[i], b[i]);//lcm是满足gcd(x_i,a[i-1])=a[i]和gcd(x_i,b[i+1])=b[i]的最小可能值if(i>1){if(__gcd(a[i-1], l)!=a[i]){cout<<"NO"<<endl;return ;}}if(i+1<=n){if(__gcd(l, b[i+1])!=b[i]){cout<<"NO"<<endl;return ;}}}cout<<"YES"<<endl;
}
signed main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int _=1;cin>>_;while(_--)slove();return 0;
}
附: