1. 程式人生 > 其它 >牛客練習賽76 校園活動 c++

牛客練習賽76 校園活動 c++

技術標籤:牛客練習賽c++佇列演算法acm競賽

校園活動

點我跳轉原題

牛牛中學為了給本校的OIer放鬆心情,決定舉報一場校園活動。
現在學校的共有 個OIer,學校想把他們分為一些小組進行一個團隊遊戲。學校先了解了一下每個同學對這個團隊遊戲的瞭解程度。
為了遊戲的公平,學校需要使分組後的每一個小組內所有人對遊戲的瞭解程度之和相等,
但同學們並不希望完全由學校來給他們分組,所以這 個人站為了一行,學校只能將佇列中一段完整的子佇列作為一個小組。
換句話說,如果你想讓位置為 x和 y(x<y) 的人在一個小組裡,你就必須讓x 和y
之間的所有人在這個組裡面。
當然,我們知道如果只有一個小組是無法進行遊戲的。

你需要判斷是否可以將他們成功分組進行遊戲,如果能成功分組進行遊戲就打印出最多能分為多少個小組,不能成功分組進行遊戲(所有人都在同一個組裡)列印“-1”。在這裡插入圖片描述
如果能成功分組,打印出最多能分為多少個小組,不能成功分組(所有人都在同一個組裡)列印“-1”。

輸入

5
31113

輸出

3

解題思路:
題目的意思是把整個佇列分成多個連續,數量可不相等的小組,所有小組的總和相等
∴我們不妨先將字串轉換為對應的陣列,在轉換的過程中記錄一下了解程度之和
然後假設能分成x組,然後看一下每組能不能分到一個整數(sum%x==0)
如果可以,再進行判定,定義一個變數為每組分配的瞭解程度,如果出現大於了該變數,說明不匹配,減少組數繼續判定

如果不存在這種情況,那麼在最後輸出-1

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
int b[2001];
int sum;
int main() {
	int n;
	scanf("%d",&n);//輸入資料
	getchar();//把空格讀了,防止讀不到字串
	string a;
	getline(cin,a);
	for(int i=0; a[i]; i++) {
		b[
i]=a[i]-'0';//處理字串 sum+=b[i]; } for(int i=n; i>1; i--) {//不能等於1,因為不能只分一個組 if(sum%i==0) { int t=sum/i;//每個組分配的瞭解程度 int count=0,flag=0; for(int j=0; j<n; j++) { count+=b[j]; if(count==t) { count=0; continue; } if(count>t) {//大於則排除這種情況 flag=1; break; } } if(flag==0) { printf("%d",i);//輸出答案,結束程式 return 0; } } } printf("-1");//沒有結束說明不存在,輸出-1 }

附:初來乍到,如果有不足之處,懇請各位大牛指正,如果題解有錯誤或者沒寫清楚的地方也歡迎在評論區提問~