牛客競賽,GDDU第十屆文遠知行杯新生程式設計競賽,摸魚記(BDEIKL題解,補G,ACFHJ)

小哈里發表於2020-12-06

碎碎念

比賽前看到評論區的提問
這個是幹啥的,求解答,第一次參加
抽獎送牛客衛衣的
hhhh重在參與

然後【注意事項】裡面寫的
1 參賽形式:個人,面向零基礎20級新生和部分有基礎新生。
4 請各位教練約束一下自己學生,老隊員儘量不要參加,至少不要帶歪榜
5 因我校新生水平有限,題目比較簡單。題目或者網路若有問題請各位教練和同學們多多擔待
說好的水賽呢?水在哪裡嚶嚶嚶

之前老師在社團群裡隨手發了個,我還以為是推薦呢,結果下午好像就我來打了?
我,qaqwq

按照過題率做了BDEIKL一共6題
G思路是對的,但是不知道為啥一直沒過,補一下

剩下五題題目沒看就算了,害。

簽到語法題:B、I

  • B就是一個字串統計O(n)列舉就行了
  • I是一個直接輸出答案的簽到題,,(Ctrl+F搜冠軍,數一下就行)
#include <bits/stdc++.h>
using namespace std;
int main(){
	string s; 
	int cnt = 0;
	while(cin>>s){
		if(s==".")break;
		for(int i = 0; i < s.size(); i++){
			if(s[i]=='a')cnt++;
		}
	}
	cout<<cnt<<"\n";
	return 0;
}

#include <bits/stdc++.h>
using namespace std;
int main(){
	cout<<"The Chinese teams has won 4 championships\n";
	return 0;
}

簽到模擬題:K,L

  • K是一個陣列模擬,會vector迭代器就白給
  • L是一個直接開方計算,注意360度的時候分個類。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
vector<int>a;
int main(){
	int n, q;
	cin>>n>>q;
	for(int i = 0; i < n; i++){
		int x;  cin>>x;  a.push_back(x);
	}
	while(q--){
		int op;  cin>>op;
		if(op==1){
			int x;  cin>>x;
			a.erase(a.begin()+x-1);
		}else if(op==2){
			int x, y;  cin>>x>>y;
			vector<int>::iterator it = a.begin()+x-1;
			a.insert(it,y);
		}else if(op==3){
			int x;  cin>>x;
			vector<int>::iterator it = a.begin()+x-1;
			int t = *it, tt = *it; it++;
			while((*it)==t && it<a.end()){
				tt += t;
				it++;
			}
			a.erase(a.begin()+x-1,it);
			a.insert(a.begin()+x-1,tt);
		}
		for(int i = 0; i < a.size(); i++){
			if(i!=0)cout<<" ";
			cout<<a[i];
		}
		cout<<"\n";
	}
	return 0;
}

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const double pi = 3.1415926535;
int main(){
	//cout<<pi<<endl;
	int T;  cin>>T;
	while(T--){
		int a, b, r, h;
		cin>>a>>b>>r>>h;
		double x = min(abs(a-b),360-abs(a-b))*1.0/360*2*pi*r;
		double ans = sqrt(x*x+1.0*h*h);
		printf("%.2lf\n",ans*ans);
	}
	return 0;
}

簽到數學題:D、E

  • 求n的階乘在m進位制下末位0的個數。這題CF有原題,這題是素數,簡化了問題,可以直接轉換為:n中p因子個數,然後迴圈就好了。結論是n/p+n/(p^2)+n/(p^3)
  • k為gcd的因子,等價於同時滿足k是i和j的因數,即有多少個i和j都是k的倍數。所以答案直接輸出(n/k)*(m/k)。(這題我還繞了好久要不要迴圈求k平方的倍數,不過已經包含了)
  • 這兩題的坑是要記得開longlong,emmm
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main(){
	int T;  cin>>T;
	while(T--){
		int n, p;  cin>>n>>p;
		LL cnt = 0, tmp = 1;
		for(int i = 1; i <= n; i++){
			tmp *= i;
			if(tmp%p==0){
				cnt++; tmp/=p;
			}
		}
		cout<<cnt<<"\n";
	}
	return 0;
}

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main(){
	int T;  cin>>T;
	while(T--){
		LL n, m, k;
		cin>>n>>m>>k;
		if(k==1){
			cout<<n*m<<endl;
			continue;
		}
		LL cnt = 0, t1, t2;
		t1 = n/k, t2 = m/k;
		cnt += t1*t2;
		cout<<cnt<<endl;
	}
	return 0;
}


補題,G

  • 無論以任何順序入場,怒氣值之和都不會改變。(結論我已經得出來了)
  • 可是不知道為什麼單跑一遍還是會TLE,我直接qaq
  • 還是想不懂自己下午為什麼會傻傻的寫錯,qaq
//結論,直接計算就行
//n個座位,m個人(按照一定排列進入)有心儀座位
//如果做不到心儀的,怒氣值為右邊以第一個空的到心儀的位置
//求安排順序讓怒氣值最小
//記得開longlong
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL a[100010];

int main(){
	int n, m;  cin>>n>>m;
	for(int i = 1; i <= m; i++)
		cin>>a[i];
	sort(a+1,a+m+1);//排序是
	LL ans = 0, s = 1;
	for(int i = 1; i <= n; i++){
		if(a[s]<=i){//如果心儀座位在i左邊,那就走過來,積累怒氣值
			ans += i-a[s];
			s++;
		}
		if(s==m+1)break;
	}
	if(s!=m+1)cout<<-1;
	else cout<<ans;
	return 0;
}

/*
/*
//貪心,每個人先選好自己的位置
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 100010;
int a[maxn];
set<int>se;
int main(){
	ios::sync_with_stdio(false);
	int n, m;  cin>>n>>m;
	for(int i = 1; i <= m; i++){
		cin>>a[i];  se.insert(a[i]);
	}
	sort(a+1,a+m+1);
	int ans = 0;
	for(int i = 1; i <= m; i++){
		if(a[i]==a[i-1]){
			int t = a[i];
			while(se.count(t))t++;
			if(t>n){cout<<-1;return 0;}
			se.insert(t);
			ans += t-a[i];
		}
	}
	cout<<ans<<"\n";
	return 0;
}
*/
/*
//貪心:所有順序結果都一樣,直接計算
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 100010;
int a[maxn];
set<int>se;
vector<int>vc;
int main(){
	int n, m;
	cin>>n>>m;
	int ans = 0;
	for(int i = 1; i <= m; i++){
		cin>>a[i];  int t = a[i];
		while(se.count(t))t++;
		if(t>n){
			cout<<"-1";
			return 0;
		}
		se.insert(t);
		ans += t-a[i];
	}
	
	cout<<ans<<"\n";
	return 0;
}
*/


/*
//列舉排列
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 100010;
int a[maxn], sc[maxn];
int main(){
	int n, m;
	cin>>n>>m;
	for(int i = 1; i <= m; i++)
		cin>>a[i];
	int ans = -1;
	do{
		memset(sc,0,sizeof(sc));
		int tmp = 0;
		for(int i = 1; i <= m; i++){
			int t = a[i];
			while(sc[t]!=0)t++;
			if(t>n){
				tmp =-1e9;
			}
			sc[t] = i;
			tmp += t-a[i];
		}
		ans = max(ans,tmp);
	}while(next_permutation(a+1,a+m+1));
	cout<<ans<<"\n";
	return 0;
}
*/

官方題解

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

相關文章