2024暑假南京外國語學校c++集訓 20240706 測試(J/S-)

e4ns發表於2024-07-07

A 膝上型電腦

第一題沒啥好說的了

點選檢視程式碼
#include<bits/stdc++.h>
using namespace std;
int n;
set<int> t;
pair<int,int> arr[100009];
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>arr[i].first>>arr[i].second;
	}
	sort(arr+1,arr+n+1);
	for(int i=1;i<=n;i++)
	{
		if(i>1)
		{
			auto it=prev(t.end());
			if((*it)>arr[i].second)
			{
				cout<<"Happy Alex";
				exit(0);
			}
		}
		t.insert(arr[i].second);
	}
	cout<<"Poor Alex";
	return 0;
}

B


這道題直接模擬,加點最佳化,a!=a(a-1)......1
當b>a時,只用計算(a+1)*(a+2).....b
好了,看程式碼

點選檢視程式碼


#include<bits/stdc++.h>
using namespace std;
#define int long long//這道題不這樣寫可能會超時,親測    nn  
int a,b;
signed main()
{
	cin>>a>>b;
	int x=b/10*10;
	if(a<x&&b>=x)
	    cout<<"0\n";
	else 
	{
		int x=1;
		for(int i=a+1;i<=b;i++)
		{
			x=x*i%10;
		}
		cout<<x<<"\n";
	}
	return 0;
}


這道題先篩掉不可能的序列,後面一個一個檢查不合法的序列,給出核心程式碼

點選檢視程式碼
f=0;
		cin>>n;
		for(int i=1;i<=4*n;i++)
		{
			cin>>arr[i];
		}
		sort(arr+1,arr+4*n+1);
		int l=0;
		for(int i=2;i<=4*n;i+=2)
		{
			if(arr[i]!=arr[i-1])
			{
				cout<<"NO\n";
				f=1;
				break;
			}
			b[++l]=arr[i];
		}
		if(f)
			continue;
		f=0;
		int x=b[1]*b[2*n];
		for(int i=1;i<=n;i++)
		{
			if(b[i]*b[2*n+1-i]!=x)
			{
				cout<<"NO\n";
				f=1;
				break;
			}
		}
		if(f)
			continue;
		cout<<"YES\n";


這道題直接分類討論+數學方法,可以加座標偏移,程式碼十分短 不給具體程式碼,可以從http://www.nfls.com.cn:20035/contest/1997/repeat尋找


這道題直接列舉 第一行答案直接列舉選的是哪個字母 非常簡單 先列舉字元 寫二重迴圈
兩重迴圈裡面生成8個長度為3的字串然後check 考試時程式碼變數名重複了,只拿了70分
正確程式碼:

F題算貪心,真正題意:有n條線段,每條線段需要分成兩段以上(兩端也可以),最少需要切幾刀 資料結構我選擇set 原因:erase方便 貪心策略:每次切右端點最靠左的位置,切到的線段從set裡清空,知道所有線段合法,中間使用ans統計答案
程式碼:

點選檢視程式碼


#include<bits/stdc++.h>
using namespace std;
int n,m,ans;
pair<int,int> tmp;
set<pair<int,int> > t;//如果編譯器版本低set<pair<int,int>> t會報錯
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>tmp.second>>tmp.first;
		t.insert(tmp);
	}
	while(t.size()>0)
	{
		tmp=(*t.begin());
		t.erase(t.begin());
		ans++;
		for(auto it=t.begin();it!=t.end();)
		{
			pair<int,int> p2=(*it);
			if(p2.second<tmp.first)
			{
				auto it2=it;
				it++;
				t.erase(it2);
				continue;
			}
			it++;
		}
	}
	cout<<ans<<"\n";
	return 0;
}

直接看樣例揣摩,如何構造,因該是規律題,只需要構造l,r裡的數,其他隨便

點選檢視程式碼


#include<bits/stdc++.h>
using namespace std;
int n,a,b,c,x[505];
int visited[1025];
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		memset(visited,0,sizeof(visited));
		cin>>n>>a>>b>>c;
		int l=b-a+1;
		int mn=0,mx=0;
		for(int i=1;i<=l;i++)
			mn+=i,x[i]=i;
		for(int i=n;i>n-l;i--)
		    mx+=i;
		if(c<mn||c>mx)
		{
			cout<<"-1\n";
			continue;
		}
		int p=l;
		while(c>mn)
		{
			x[p]++;
			if(x[p]==(n-(l-p)))
			    p--;
			mn++;
		}
		for(int i=1;i<=l;i++)
		{
			visited[x[i]]=1;
		}
		int tmp=1;
		for(int i=1;i<=n;i++)
		{
			if(i==a)
			{
				for(int j=1;j<=l;j++)
				    cout<<x[j]<<" ";
				i=b;
			}
			else
			{
				while(visited[tmp])
				    tmp++;
				cout<<tmp<<" ";
				visited[tmp]=1;
			}
		}
		cout<<"\n";
	}
	return 0;
}

相關文章