2019浙江ACM省賽——部分題目


有一些題目過了我還沒有重新寫,先放一些我重新寫好了的吧

簽到題拿到了信心吧,9分鍾寫完兩題,我們賊開心,我大哥說簽到題有什么好開心的,如果不是我有一些地方卡了下,可能還是更快吧,還有就是測試案例多試了幾個,不過這個是必須的。

現在回想當時比賽還是有點緊張,這個就是ACM的樂趣吧,感覺我今年就應該退役了,覺得下面的學弟都比我厲害多了,這兩天搭個OJ給學弟們刷題用,訓練還是要搞起來,平時的練習賽真的幫我們長了很多默契,特別是前面題目的時候我連看都沒有看,直接上手就敲模板,然后學弟看完了直接報,速度抓起來了,信心也抓起來了。

這次比賽感謝大佬隊友帶飛,現在回顧了下排行榜拿的金獎還是運氣好,在我們排名下面的做出來的速度都是比我們快,但是他們有罰時,我們一次AC(人品爆炸)

最后花了兩個多小時寫J題還是沒有做出來,總的思路是對的,有一些細節的地方還是還沒有想到,菜是原罪,現場也有兩個專科組的做出來了,回來之后理了下看了下別人的題解,一下子就是寫出來了。

G題

Lucky 7 in the Pocket

簽到水題

題解:輸入一個數字找比他大的最小那個數字能被7整除不能被4整除(直接寫代碼了,就不多解釋了)

#include<bits/stdc++.h>
using namespace std;
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		int n;
		scanf("%d",&n);
		for(int i=n;;i++){
			if(i%7==0 && i%4!=0){
				cout<<i<<endl;
				break;
			}
		}
	}
	
	
	return 0;
}

F題

Abbreviation

簽到水題

題解:第一個不舍去,從第二個開始 包含 'a', 'e', 'i', 'y', 'o', 'u'  就不輸出 很簡單遍歷一下就好了 這題因為我剛開始少打了個第一個字母還慢了差不多半分鍾。罪過

#include<bits/stdc++.h>
using namespace std;
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		char num[1005];
		scanf("%s",&num);
		cout<<num[0];
		for(int i=1;i<strlen(num);i++){
			if(num[i]=='a' || num[i]== 'e' || num[i]=='i' || num[i]=='y'||num[i]=='o'||num[i]=='u'){
				continue;
			}
			cout<<num[i];
		}
		cout<<endl;
	}
	
	
	return 0;
}

E題

Sequence in the Pocket

思維題

題解:給你一組數字問你每一次選一個數字放在最前面,問你最少移動幾次讓他變成不下降序列。比如 2 2 3 3 4 或者1 2 3 4 5

給個新的數組,直接排序,然后從沒有排序的數組那邊從最大的開始往他的左邊找,每一次按排好序的數組來求最長連續的序列長度寫兩個例子吧,可能說的不是很清楚

比如 3 4 5 1 2 這組數據的話就是先排好序 1 2 3 4 5 然后從最大的開始往左 那么就是5 4 3 就是有三個已經是符合排好序的標准了 那么我們只要去移動剩下的兩個就好了 所以答案就是 5(數組長度)-2=3

再來一組 3 3 2 5 1 2 排好序后是 1 2 2 3 3 5 我們可以看出 3 3 5 在有沒有排好的情況下 已經都是一樣的了 所以只要減去排好的長度 就是答案 6-3 = 3

我大哥講題的時候一下子沒有聽懂,就直接讓他上去了打了,回來的時候我重新去整理了下思路,大哥就是大哥一下子就是想的那么快。

code:

#include<bits/stdc++.h>
using namespace std;
int main(){
	int T;
	cin>>T;
	while(T--){
		int n;
		cin>>n;
		long long a[100055];
		long long b[100055];
		
		int maxIndex = -1;
		long long maxNum = -1;
		
		for(int i=0;i<n;i++){
			cin>>a[i];
			b[i]=a[i];
			if(maxNum<=a[i]){
				maxNum = a[i];
				maxIndex = i;
			}	
		}
		sort(b,b+n);
		int j = n-1;//最大的那個數字 
		long long sum = 0;
		for(int i=maxIndex;i>=0;i--){
			if(b[j]==a[i]){
				j--;
				sum++;
			}
		}
		cout<<n-sum<<endl;
	}
	
	
	return 0;
}

  

 

證明我是菜雞的

Welcome Party

1,主要思路先建立關系,進行並查集的合並大的數字指向小的,合並完成后把那些指向自己的根給單獨拿出來放入根的數組里面去

2.放好之后開始操作,用優先隊列,這樣就能解決了字符序的問題(當時想到了用隊列,忘記了優先隊列)

3.剩下的把指向他的逐一拿出來壓入優先隊列中會自動幫你處理字符序

#include<bits/stdc++.h>

using namespace std;
int root[1000055];
int find(int x){//找根 
	while(root[x]!=x){
		x = root[x];
	} 

	return x;
} 
void union1(int x,int y){
	int fx = find(x);
	int fy = find(y);
	if(fx<fy){
		root[fy]=fx;
	}
	else{
		root[fx]=fy;
	}
} 
int vis[1000005];//判斷是不是放在答案的數組里面了
int ansCount = 0;
int ans[1000005];
vector<int> vv[1000005]; 
void bfs(int st){
	priority_queue<int,vector<int>,greater<int> > pq;
	pq.push(st);
	while(!pq.empty()){
		int cu = pq.top();
		pq.pop();
		if(vis[cu]==1) continue;//代表已經訪問過了
		vis[cu]=1;
		ans[ansCount++] = cu;//添加進去
		for(int i=0;i<vv[cu].size();i++){
			int v = vv[cu][i];
			if(vis[v]!=1){
				pq.push(v); 
			}
		} 
		
	} 
} 
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		ansCount = 0;
		
		int n,m;
		scanf("%d %d",&n,&m);
		for(int i=0;i<=n;i++){
			vv[i].clear();
			vis[i]=0;
			root[i]=i;
		}
		for(int i=1;i<=m;i++){
			int a,b;
			scanf("%d %d",&a,&b);
			vv[a].push_back(b);
			vv[b].push_back(a);
			union1(a,b);
		}
		int ans1 = 0;
		for(int i=1;i<=n;i++){//如果是指向着自己那么就是根 
			if(root[i]==i){
				ans1++;
				vv[0].push_back(i);//把根全部加入到數組里面 
			}
		}
		bfs(0);
		cout<<ans1<<endl;
		for(int i=1;i<ansCount;i++){
			printf("%d",ans[i]);
			if(i==ansCount-1){
				printf("\n");
			}
			else{
				printf(" ");
			}
		}
		
		
	}
	
	
	
	return 0;
}

 

I 這題學弟找到了規律后來直接交給他了 用的Java的大數,還好練習賽的時候有大數題練了手 心驚膽戰的過掉了 看了下大哥們的題解其實感覺可能當時后台的數據就是不是很好,仔細想想可能綠掉

Singing Everywhere

#include<bits/stdc++.h>
using namespace std;
int main(){
	int T;
	cin>>T;
	while(T--){
		long int num[100005];
		int n;
		cin>>n;
		
		for(int i=1;i<=n;i++){
			cin>>num[i];
			
		}	
		num[n+1]=99999999999;
		num[0]=99999999999;
		long long ansEnd = 0;
		for(int i=2;i<=n-1;i++){
			if(num[i]>num[i-1] && num[i]>num[i+1]){
				ansEnd++; 
			}
		}
		
		long long ans = 0;
		for(int i=2;i<=n-1;i++){
			long long notAns = 0;//沒有刪
			long long ansEd = 0;//刪了的 
			if(num[i+1]>num[i-1] && num[i+1]>num[i+2]){
				ansEd++;
			}
			if(num[i-1]>num[i-2] && num[i-1]>num[i+1]){
				ansEd++;
			}
			if(num[i]>num[i-1] && num[i]>num[i+1]){
				notAns++;
			}
			if(num[i-1]>num[i-2] && num[i-1]>num[i]){
				notAns++;
			}
			if(num[i+1]>num[i+2] && num[i+1]>num[i]){
				notAns++;
			}
			
			if(ans<=notAns-ansEd){
				ans = notAns-ansEd;
			}
		}
		cout<<ansEnd-ans<<endl;
	}
	
	
	
	return 0;
} 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM