Codeforces Round 886 (Div. 4)(A-H)

发布时间 2023-07-22 15:35:15作者: liuwansi

A-To My Critics

读入 a,b,c 如果三个里较大的两个的和大于等于 10 输出 YES,不然输出 NO

#include <bits/stdc++.h>
using namespace std;
 
void solve()
{
    int a, b, c;
    cin >> a >> b >> c;
    cout << (a+b+c-min({a,b,c}) >= 10 ? "YES\n" : "NO\n");
    
}
 
int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        solve();
    }
}

B - Ten Words of Wisdom

读入n个数然后读入a,b若是a>=10直接忽略,不然就记录最大的b的序号

#include <bits/stdc++.h>
 
using namespace std;
 
const int MAX = 200007;
const int MOD = 1000000007;
 
void solve() {
	int n;
	cin >> n;
	int winner = -1, best_score = 0;
	for (int i = 1; i <= n; i++) {
		int a, b;
		cin >> a >> b;
		if (b > best_score && a <= 10) {winner = i; best_score = b;}
	}
	cout << winner << '\n';
}
 
int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int tt; cin >> tt; for (int i = 1; i <= tt; i++) {solve();}
	// solve();
}

C-Word on the Paper

遍历二维数组只要不是点就输出他

#include<bits/stdc++.h>
using namespace std;


int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
        char a;
        for(int i=0;i<8;i++)
        {
            for(int j=0;j<8;j++)
            {
                cin>>a;
                if(a!='.')cout<<a;
            }
        }
        cout<<endl;
    }
}

E-Cardboard for Pictures

对答案进行二分查找:找到最大的w的,使得f(w)<=c,理论上w的最大值不会超过1e9,因为c不超过1e18,关于实现的一点说明:f(x)的值可能超过64位整数

#include<bits/stdc++.h>
#define int  unsigned long long
using namespace std;
const int N=2e5+5;
int n,c;
int s[N];
void solve()
{
    cin>>n>>c;
    int s1=0,s2=0;
    for(int i=1;i<=n;i++)
    {
        cin>>s[i];
        s1+=s[i];
        s2+=s[i]*s[i];
    }
    c-=s2;
    c=c/4;
    c=c/n;
    s1/=2*n;
    int t=sqrt(s1*s1+c);
    t-=s1;
    //int t=(sqrt(s1*s1-n*(s2-c))-s1)/(2*n);
    cout<<t<<endl;
    return;


}
int32_t main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
        solve();
    }
    return 0;
}

被注释掉的那一部分和上面那一部分没有本质区别,但是就是更换之后就会在样例的第九个过不了但将其分开计算就不会wa百思不得其解,不在知道为啥

原因:是在先乘后除的时候乘法爆了只要你能做到先乘后除即可

F - We Were Both Children

首先大于n的ai都直接忽略,记录每个距离下游多少只青蛙,然后遍历从1到n的每个i,并将cnti添加到小于或者等于n的每个i的倍数,然后遍历1到n的所有数字 取最大值

#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
    int n;
    cin>>n;
    vector<int>cnt(n+1,0),mx(n+1,0);
    for(int i=0;i<n;i++)
    {
        int x;
        cin>>x;
        if(x<=n)cnt[x]++;
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=i;j<=n;j+=i)mx[j]+=cnt[i];
    }
    int maxn=0;
    for(int i=1;i<=n;i++)
    {
        maxn=max(maxn,mx[i]);
    }
    cout<<maxn<<endl;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--)
    {
        solve();
    }
}

G. The Morning Star

和前两天做的那个"求多少对直线有公共交点"的题目有些相似,要记住n条斜率不同的直线组成的相交对是n *(n-1)/2
与之相似的是在这道题中需要考虑哪个作为指南针,哪个作为晨星因此计算方法应为n*(n-1)

#include<bits/stdc++.h>
using namespace std;
#define liuwansi ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long 
int n,t;
map<int,int>up,side,diag1,diag2;
int ans;
signed main()
{
    liuwansi
    cin>>t;
    while(t--)
    {
        up.clear();
        side.clear();
        diag1.clear();
        diag2.clear();
        ans=0;
        cin>>n;
        for(int i=0;i<n;i++)
        {
        int x,y;
        cin>>x>>y;
        up[x]++;
        side[y]++;
        diag1[x-y]++;
        diag2[x+y]++;
        }
        for(auto x:up)
        {
        ans+=x.second*(x.second-1);
        }
        for(auto x:side)
        {
        ans+=x.second*(x.second-1);
        }
        for(auto x:diag1)
        {
        ans+=x.second*(x.second-1);
        }
        for(auto x :diag2)
        {
            ans+=x.second*(x.second-1);
        }
        cout<<ans<<endl;
    }
    
}

H. The Third Letter

#include "bits/stdc++.h"
using namespace std;
 
#define ll long long
 
#define          all(v)              v.begin(), v.end()
#define         rall(v)              v.rbegin(),v.rend()
 
#define            pb                push_back
#define          sz(a)               (int)a.size()
 
#define int long long
const int N = 2e5 + 5;
vector<pair<int, int>> adj[N];
int val[N], vis[N];
void dfs(int u) {
    vis[u] = 1;
    for(auto x: adj[u]) {
        int v = x.first, w = x.second;
        if(!vis[v]) {
            val[v] = val[u] + w;
            dfs(v);
        }
    }
}
void solve() {
    int n, m; cin >> n >> m;
    for(int i = 1; i <= n; ++i) {
        adj[i].clear();
        vis[i] = 0, val[i] = 0;
    }
    vector<array<int, 3>> c;
    for(int i = 1; i <= m; ++i) {
        int a, b, d; cin >> a >> b >> d;
        adj[a].pb({b, d});
        adj[b].pb({a, -d}); 
        c.pb({a, b, d});  
    }
    for(int i = 1; i <= n; ++i) {
        if(!vis[i]) dfs(i);
    }
    for(int i = 1; i <= m; ++i) {
        int a = c[i - 1][0], b = c[i - 1][1], d = c[i - 1][2];
        if(val[a] + d != val[b]) {
            cout << "NO\n";
            return;
        }
    }
    cout << "YES\n";
}   
 
int32_t main() {
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t = 1;
    cin >> t;
    while(t--) {
        solve();
    }
}