codeforces #867 div3 (2/8)

A
我的代码

#include<iostream>
#include<cstring>
#include<algorithm> 
#define endl "\n"
#define IOS std::ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);  

using namespace std;

typedef pair<int,int> PII;

const int N=100;

vector<PII> v;
int a[N],b[N];

void solve()
{
	v.clear();
	int n;
	int t;
	cin>>n>>t;
	
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	for(int i=0;i<n;i++)
	{
		cin>>b[i];
	}
	
	for(int i=0;i<n;i++)
	{
		int a1=a[i],b1=b[i];
		v.push_back({a1,b1});
	}
	int idx=-1,ans=-1,time=0;
	 
	for(int i=0;i<n;i++)
	{
		if(v[i].first+time<=t)
		{
			if(v[i].second>ans)
			{
				idx=i+1;
				ans=v[i].second;
			}
		}
		time++;
	} 
	
	cout<<idx<<endl; 
	
}

int main()
{
	IOS;
	int T;
	cin>>T;
	while(T--)
	{
		solve();	
	}
	return 0;
}

我是纯模拟,没怎么动脑结果费了好多时间~
正解应该是预处理t[i]
然后判断
某佬代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
 
#define fi first
#define se second
#define endl "\n"
#define IOS std::ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);
using namespace std; 
 
void solve()
{
	int n,t,id=-2;
	cin>>n>>t;
	vector<int> a(n),b(n);
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
		a[i]+=i;	
	}
	for(int i=0;i<n;i++)
	{
		cin>>b[i];
	}
 
	for(int i=0;i<n;i++)
	{
		if(a[i]<=t &&(id==-2||b[id]<b[i])) id=i;
	}
	cout<<id+1<<endl;
}
 
int main()
{
	IOS;
	int T;
	cin>>T;
	while(T--)
	{
		solve();
	}
	return 0;
}

B

我的代码:

#include<iostream>
#include<cstring>
#include<algorithm> 
#define endl "\n"
#define IOS std::ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);  

using namespace std;

typedef pair<int,int> PII;
typedef long long ll;

const int N=2e5+10;

ll a1[N];
vector<ll> a,b;
vector<ll> c; 
void solve()
{
	int n;
	cin>>n;
	int b_cnt=0;
	int a_cnt=0;
	int flag_0=0;
	a.clear();
	b.clear();
	c.clear();
	for(int i=0;i<n;i++)
	{
		ll x;
		cin>>x;
		c.push_back(x);
		if(x<0) b.push_back(x);
		else if(x>=0) a.push_back(x);
		if(x==0) flag_0=1;
	}
	ll ans=-1e9-10;
	sort(a.begin(),a.end());
	sort(b.begin(),b.end());
	

		if(n==2) ans=c[0]*c[1];
		else 
		{
			if(a.size()>=2&&b.size()>=2)
			{
				ans=max(a[a.size()-2]*a[a.size()-1],b[0]*b[1]);
			}
			else if(a.size()<2&&b.size()>=2)
			{
				ans=b[0]*b[1];
			}
			else if(a.size()>=2&&b.size()<2)
			{
				ans=a[a.size()-2]*a[a.size()-1];
			}	
		}
		
			

	cout<<ans<<endl;
	
	
}

int main()
{
	IOS;
	int T;
	cin>>T;
	while(T--)
	{
		solve();	
	}
	return 0;
}

某佬的代码:其实只要排个序然后 ans=max(a[0]*a[1],a[n-1]*a[n-2]) 就好了~

#include<iostream>
#include<cstring>
#include<algorithm>

#define fi first
#define se second
#define endl "\n"
#define IOS std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

typedef long long ll;

using namespace std;
const int N=2e5+10;

ll a[N];
void solve()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	sort(a,a+n);
	ll ans=max(a[0]*a[1],a[n-1]*a[n-2]);
	cout<<ans<<endl;
}

int main()
{
	IOS;
	int T;
	cin>>T;
	while(T--)
	{
		solve();
	} 
	
	
	return 0;
}

C
赛时:一开始想到了怎么做:s[i]=s[i-1]+2*n+1;
结果不知道怎么处理,刚刚看了别人的代码发现可以这样做

#include<iostream>
#include<cstring>
#include<algorithm> 
#define endl "\n"
#define IOS std::ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);  

using namespace std;

typedef pair<int,int> PII;
typedef long long ll;

const int N=1e5+10;

struct node{
	ll x,id;
	ll ans;
}s[N];

bool cmp_id(node a,node b){
	if(a.id!=b.id) return a.id<b.id;
}

bool cmp_x(node a,node b){
	if(a.x!=b.x) return a.x<b.x; 
}

int main()
{
	IOS;
	int T;
	cin>>T;
	for(int i=0;i<T;i++){
		cin>>s[i].x;
		s[i].id=i;
	}
	
	sort(s,s+T,cmp_x);
	
	ll res=26,cnt=4;
	for(int i=0;i<T;i++){
		while(cnt<s[i].x){
			res = res + 2 * (cnt + 1) + 1;
			cnt++; 
		}
		s[i].ans=res;
	}
	sort(s,s+T,cmp_id);
	for(int i=0;i<T;i++){
		cout<<s[i].ans<<endl;
	}cout<<endl;
	return 0;
}

这是O(1)的方法:

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

typedef long long ll;

int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		ll n;
		cin>>n;
		ll ans=(n*(n-1))/2 + 1 + ((n-2)*(n-1))/2+ 4*n;
		cout<<ans<<endl;
	}
	
	return 0;
}

D
思路:(其实是官方题解。。。)

k表示n在排列a中所占的位置,若k > 1
则bk = (bk-1 + n) % n = bk-1 。矛盾
故 n 只能处于排列 a 中的一个位置

分类讨论n为奇数还是偶数
当n为奇数:
队列a 中第一个元素为 n ,b1 = 0
若n为奇数 则bn = ( n * (n+1) / 2 ) % n 为 0 ,矛盾
故n为奇数无解(n==1除外)

当n为偶数:
则只有一种可能:
a = [n,1,n-2,3,n-4,5…n-1,2 ]
b = [0,1,n-1,2,n-2,3,n-3,…,n/2]

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>

#define endl "\n" 
using namespace std;

void solve()
{
	vector<int> res;
	
	int n;
	cin>>n;
	
	if(n==1){
		cout<<1<<endl;
		return;
	}
	if(n&1){
		cout<<-1<<endl;
		return;
	}
	for(int i=0;i<n;i++){
		if(i%2){
			cout<<i<<' ';
		}else{
			cout<<n-i<<' ';
		}
	}
	cout<<endl;
	
}

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

自我反思:我是**。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值