2024/2/24

D. Coprime

原题链接:Problem - D - Codeforces

题目大意:

寻找两个互素元素,要求找出这样的一对互素元素数组下标和最大,如果没有这样的互素元素输出-1。

题目做法:

总体来说就是拿那个比较小的1000来做文章

AC代码:

#include<bits/stdc++.h>
#define pb(element) push_back(element)
#define fast ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
//#define int long long
#define ll long long
//Cara's templet version 1.19
//2024/2/20 20:32 UTC+8
//Blood Toil Tears Sweat
using namespace std;
const int maxn=3e5+10;
vector<int> p[1001];
void init()
{
    for(int i=1;i<=1000;i++)
    {
        for(int j=i;j<=1000;j++)
        {
            if(__gcd(i,j)==1)
            {
                p[i].pb(j);
                p[j].pb(i);
            }
        }
    }
}
void solve()
{
	int ps[1001];
    int n,res=-1,t;
    cin>>n;
    for(int i=1;i<=1000;i++) ps[i]=0;
    for(int i=1;i<=n;i++)
    {
        cin>>t;
        ps[t]=i;
    }
    for(int i=1;i<=1000;i++)
    {
    	if(ps[i]==0) continue;
        for(int j=0;j<p[i].size();j++)
        {
        	if(ps[p[i][j]]!=0)
        	{
        		res=max(res,ps[i]+ps[p[i][j]]);
			}
		}
    }
    cout<<res<<'\n';
}
signed main()
{
    init();
	fast int casen=1;
	cin>>casen;
	while(casen--) solve();
}

E. Scuza

原题链接:Problem - E - Codeforces

题目大意:

题目做法:

前缀和+二分

AC代码:

#include<bits/stdc++.h>
#define pb(element) push_back(element)
#define fast ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
#define ll long long
//Cara's templet version 1.19
//2024/2/20 20:32 UTC+8
//Blood Toil Tears Sweat
using namespace std;
const int maxn=3e5+10;
void solve()
{
    int n,k,t;
    cin>>n>>k;
    int ar[n+10];
    int prefix[n+10];
    prefix[0]=ar[0]=0;
    for(int i=1;i<=n;i++)
    {
        cin>>ar[i];
        prefix[i]=prefix[i-1]+ar[i];
        ar[i]=max(ar[i-1],ar[i]);
    }
    // for(int i=1;i<=n;i++) cout<<prefix[i]<<' ';
    // cout<<'\n';
    for(int i=0;i<k;i++)
    {
        cin>>t;
        // int ps=upper_bound(ar+1,ar+n+1,t)-ar-1;
        // cout<<ps<<" ";
        cout<<prefix[upper_bound(ar+1,ar+n+1,t)-ar-1]<<' ';
    }
    cout<<'\n';
}
signed main()
{
    fast int casen=1;
	cin>>casen;
	while(casen--) solve();
}

D. Friends and the Restaurant

原题链接:Problem - D - Codeforces

题目大意:

有n个朋友要去恰饭。

每个朋友都有两个属性xi(他要在餐厅里花的钱)yi(他身上有的钱),每天然后他们以至少两人为一组去吃饭。每组的总花费要小于他们身上总共有的钱,问最多能分多少组,也即最大多少天。

题目做法:

引入一个新的属性,yi-xi,也即每个人的贡献度,根据这个从小到大排个序,这个贡献度为正的无疑都可以两两配自己玩自己的,现在就是要把这个贡献度为负的尽可能地往组里加,且还是只能用一个正的去抵消,如果两个及以上,对结果不会有正向影响。

AC代码:

#include<bits/stdc++.h>
#define pb(element) push_back(element)
#define fast ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
#define ll long long
//Cara's templet version 1.19
//2024/2/20 20:32 UTC+8
//Blood Toil Tears Sweat
using namespace std;
const int maxn=3e5+10;
struct node
{
    int x,y;
};
bool cmp(int x,int y)
{
    return x>y;   
}
void solve()
{
    int n,res=0;
    cin>>n;
    node ar[n];
    vector<int> a1,a2;
    for(int i=0;i<n;i++)
    {
        cin>>ar[i].x;
    }
    for(int i=0;i<n;i++)
    {
        cin>>ar[i].y;
        int t=ar[i].y-ar[i].x;
        if(t>=0) a1.pb(t);
        else a2.pb(t);
    }
    sort(a1.begin(),a1.end());
    sort(a2.begin(),a2.end(),cmp);
    // for(auto it:a1)
    // {
    //     cout<<it<<' ';
    // }
    // cout<<'\n';
    // for(auto it:a2)
    // {
    //     cout<<it<<' ';
    // }
    // cout<<'\n';
    int inips1=0,inips2=0,allpos=a1.size();
    while(inips1<a1.size()&&inips2<a2.size())
    {
        if(a1[inips1]>=abs(a2[inips2])) res++,inips1++,inips2++,allpos--;
        else
        {
            inips1++;
        }
    }
    cout<<allpos/2+res<<'\n';
}
signed main()
{
    fast int casen=1;
	cin>>casen;
	while(casen--) solve();
}

D. Merge Equals

原题链接:Problem - 962D - Codeforces

题目大意:

给你一个数组

题目做法:

离散化+实施

RE了两发,尚未知原因,回头得查一下

AC代码:

#include<bits/stdc++.h>
#define pb(element) push_back(element)
#define fast ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
#define ll long long
//Cara's templet version 1.19
//2024/2/20 20:32 UTC+8
//Blood Toil Tears Sweat
using namespace std;
const int maxn=1e5+5e4+10;
set<int> ar[maxn];
map<int,int> mp;
int print[maxn];
set<int> num;
int cou=1;
void solve()
{
    int n,t,ci=0;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>t;
        if(mp[t]==0)
        {
            mp[t]=cou++;
            num.insert(t);
        }
        //cout<<i<<" "<<mp[t]<<'\n';
        ar[mp[t]].insert(i);
    }
    // for(auto it:mp)
    // {
    //     cout<<it.first<<" "<<it.second<<'\n';
    // }
    // for(auto it1:num)
    // {
    //     cout<<it1<<':';
    //     for(auto it2:ar[mp[it1]])
    //     {
    //         cout<<it2<<' ';
    //     }
    //     cout<<'\n';
    // }
    // cout<<'\n';
    // bool f=1;
    // while(f)
    // {
    //     f=0;
        for(auto it1:num)
        {
            //cout<<"??"<<it1<<'\n';
            int tcou=mp[it1];
            // if(ar[tcou].size()>=2) f=1;
            while(ar[tcou].size()>1)
            {
                int fps=*ar[tcou].begin(),sps=*(++ar[tcou].begin());
                ar[tcou].erase(ar[tcou].begin());
                ar[tcou].erase(ar[tcou].begin());
                int tas=it1*2;
                if(mp[tas]==0)
                {
                    mp[tas]=cou++;
                    num.insert(tas);
                }
                ar[mp[tas]].insert(sps);
                //break;
            }
            // if(ar[tcou].size()==0) num.erase(it1);
            // ci++;
            // if(ci==10) break;
            //cout<<'\n';
            //break;
        }
        // for(auto it1:num)
        // {
        //     cout<<it1<<':';
        //     for(auto it2:ar[mp[it1]])
        //     {
        //         cout<<it2<<' ';
        //     }
        //     cout<<'\n';
        // }
    // }
    for(auto it1:num)
    {
        //cout<<it1<<':';
        for(auto it2:ar[mp[it1]])
        {
            //cout<<it2<<"::"<<it1<<'\n';
            print[it2]=it1;
            ci++;
        }
        //cout<<'\n';
    }
    cout<<ci<<'\n';
    for(int i=0;i<maxn;i++)
    {
        if(print[i])
        {
            cout<<print[i]<<' ';
            ci--;
            if(ci==0) break;
        }
    }
    //break;
}
signed main()
{
    fast int casen=1;
	//cin>>casen;
	while(casen--) solve();
}
/*
6
3 4 1 2 1 2
*/

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值