每个输入包含一个测试用例。每个测试用例的第一行包含一个整数M(1 <= M<= 100),接下来的一行包含M个整数ni(1 <= ni <= 100)。
输出一行表示最少需要移动多少次可以平分苹果,如果方案不存在则输出-1。
4 7 15 9 5
3
2 3 6
-1
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main(void){ int M, ni, sum = 0, average, count = 0; vector<int> toy; cin>>M; for(int i = 0; i < M; ++i){ cin>>ni; sum += ni; toy.push_back(ni); } average = sum / M; if(sum % M){ cout<<-1<<endl; return 0; } for(int ni : toy){ if((ni-average)%2){ cout<<-1<<endl; return 0; } if((ni-average) > 0){ count += (ni-average)/2; } } cout<<count<<endl; return 0; }
#include<bits/stdc++.h> using namespace std; int main() { int m,sum=0; cin>>m; vector<int>num(m); for(int i=0;i<m;i++) { cin>>num[i]; sum+=num[i]; } if(sum%m!=0) { cout<<-1<<endl; return 0; } sort(num.begin(),num.end()); int n=sum/m,i=0,j=m-1,res=0; while(i<j) { if(num[i]<=n-2&&num[j]>=n+2) { num[i]+=2; num[j]-=2; res++; } else if(num[i]==n&&num[j]>=n+2) i++; else if(num[j]==n&&num[i]<=n-2) j--; else if(num[i]==n&&num[j]==n) { i++; j--; } else { cout<<-1<<endl; } } if(num[i]==n&&num[j]==n) cout<<res<<endl; else cout<<-1<<endl; return 0; }
n = int(input()) arr = sorted(list(map(int, input().split()))) total = sum(arr) if total % n != 0: # 玩具总数不是n的倍数,无法完成均分玩具 print(-1) else: target = total // n # 两端双指针,右指针往左指针搬运 left, right = 0, n - 1 count = 0 while left < right: while arr[left] != target and arr[right] != target: arr[left] += 2 arr[right] -= 2 count += 1 if arr[left] > target&nbs***bsp;arr[right] < target: break if arr[left] == target and arr[right] == target: # 同时达到目标值,左右指针同时移动 left += 1 right -= 1 elif arr[left] == target: # 左指针达到目标值,左指针移动 left += 1 elif arr[right] == target: # 右指针达到目标值,右指针移动 right -= 1 else: # 达不到目标值,无法完成任务 count = -1 break print(count)
/* 思路:这里有两种情况是不能实现评平均分配的 ①总和不能被m整除 ②总和可以被m整除,但是有某些组员距离平均值的差值不是偶数 当排除上面的情况之后,统计每个元素与平均值之间的差值的一半 最后把这个总和除以2,就是需要移动的次数,因为移动式成对的,一个数减少,就是添加到另一个数上面 */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int m = Integer.parseInt(br.readLine()); String[] str = br.readLine().split(" "); int[] arr = new int[m]; int sum = 0,avg = 0,count = 0; for(int i = 0;i<m;i++){ arr[i] = Integer.parseInt(str[i]); sum += arr[i]; } if(sum %m != 0){ System.out.println(-1); return; } else{ avg = sum / m; for(int i = 0;i<m;i++){ int temp = Math.abs(arr[i] - avg); if(temp %2 != 0){ System.out.println(-1); return; }else{ count += temp/2; } } } System.out.println(count/2); } }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] record = new int[n]; int sum =0; for (int i = 0; i < n; i++) { record[i]=scanner.nextInt(); sum+=record[i]; } if (sum%n!=0){ System.out.println(-1); return; } int average= sum/n; int count=0; for (int i = 0; i < n; i++) { int diff=record[i]-average; if (diff%2!=0){ System.out.println(-1); return; } if (diff>0){ count+=diff/2; } } System.out.println(count); } }
// 玩具变苹果 怎么都不可能吧 所以此题必输出-1 ; #include <iostream> using namespace std; int main() { int m; cin >> m; int res = 0; int counts = 0; int *data = new int[m]; cin >> data[0]; int sum = data[0]; for(int i = 1;i<m;i++) { cin >> data[i]; if(data[i]%2!=data[i-1]%2) { res = 1; break; } sum += data[i]; } if(sum%m!=0) res = 1; if(res) cout << -1 << endl; else { int avr = sum/m; for(int i = 0;i<m;i++) { if(data[i]>avr) counts += (data[i]-avr)/2; } cout << counts << endl; } return 0; }
#include<bits/stdc++.h> using namespace std; int main() { int n; while (cin >> n) { vector<int> f(n); int sum = 0; for (int i=0; i<n; ++i) { cin >> f[i]; sum += f[i]; } if (sum % n != 0) { cout << "-1" << endl; continue; } int avg = sum / n; int small = 0; for (int k : f) { if (k < avg ) { if (((avg-k) % 2) != 0) { cout << "-1" << endl; continue; } else { small += ((avg-k) >> 1); } } } cout << small << endl; } return 0; }
#include <bits/stdc++.h> using namespace std; int main(){ int n; cin>>n; int a[n],s=0; for(int i=0;i<n;i++){ cin>>a[i]; s += a[i]; } int t = s/n, d=0; if(s != n*t) cout<<-1<<endl; else{ s = 0; for(int i=0;i<n;i++){ d = abs(a[i]-t); if(d&1){ cout<<-1<<endl; break; }else s += d; } cout<<s/4<<endl; } return 0; }
# 思路 # 找到list中比平均值小的那部分,与平均作差并累加 # 因为一次操作 = 高于平均的某个数 - 1 and 低于平均的某个数 + 1 # 故仅计算低于平均值的部分与平均值的差即可 M = int(input()) ni = list(map(int, input().split())) sum_n = sum(ni) # ni 中苹果的总数 avg_n = sum_n // M # ni 中苹果的平均数 ni.sort() # 使 ni 有序,便于之后只选择小于平均数的部分计算需要的移动次数 if sum_n % M is not 0: # 总的苹果数若不能被平分 则不存在可以平分的方法 print(-1) else: res = 0 i = 0 while ni[i] < avg_n: # 取比平均苹果数量小的部分,累加计算与平均值的差 res += avg_n - ni[i] i += 1 # 上面是按照移动一个苹果来计算的 因为一次只能拿两个苹果 故如果结果不能被2整除 则不存在可以平分的方法 # 最后结果 res 也需要除以2 print(res // 2) if res % 2 == 0 else print(-1)
"运行时间:34ms" "占用内存:3432k" m = int(input()) li = list(map(int,input().split())) avg = sum(li) // m # 平均每人分多少个 flag = sum(li) % m # 是否能平分(没有余数就能平分) res = 0 if flag == 0: for i in li: if abs(i-avg)%2 == 1: # 如果奇数个,由于每次只能拿2个,故无法分匀 print(-1) break else: # 如果偶数个,差多少(多的话退)补多少 res += abs(i-avg) // 2 # 退的 和 补的 相加,最后res取1/2,则为移动次数 print(res // 2) else: print(-1)
M = int(input()) N = list(map(int, input().split())) N.sort() res = 0 if sum(N) % M == 0: avg = sum(N) // M N = [abs(i - avg) for i in N] res = sum(N) // 4 else: res = -1 print(res)
import java.util.Scanner; public class Main{ public static void main(String [] argvs){ // input Scanner sc = new Scanner(System.in); int count = Integer.valueOf(sc.nextLine()); int [] apples = new int[count]; String [] applestr = sc.nextLine().split(" "); int total = 0; for(int i=0;i<applestr.length;i++){ apples[i] = Integer.valueOf(applestr[i]); total+=apples[i]; } sc.close(); // 不能均分 if(total%count!=0){ System.out.println("-1"); return; } int appleTarget = total/count; int mod = appleTarget%2; int result = 0; // 1.DP解法. 2.奇偶性解法 // 奇偶性:因为一次只能拿两个,所以本身拥有的apple数要和目标数同奇偶。转移次数=差值/2,有因为同时计算了拿出和放入,故最后result除2 for(int i=0;i<apples.length;i++){ int currApple = apples[i]; if(currApple%2!=mod){ System.out.println("-1"); return; } int diff = currApple-appleTarget; diff = diff>0? diff:(-diff); result += diff/2; } System.out.println(result/2); } }
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { int n;cin>>n; int sum=0; int avg; int flag; int res=0; vector<int>vec(n,0); for(int i=0;i<n;i++){ cin>>vec[i]; sum+=vec[i]; } avg=sum/n; flag=sum%n; if(flag==0){ for(int i=0;i<n;i++){ if((vec[i]-avg)%2==1){cout<<-1<<endl; break;} else res+=abs(vec[i]-avg)/2; }cout<<res/2<<endl; } else cout<<-1<<endl; }
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { int n; cin >> n; vector<int> vec(n,0); for(int i = 0; i < n;i++) cin >> vec[i]; sort(vec.begin(), vec.end()); int num = 0; while(vec[n-1] > vec[0]) { if(vec[n-1] == vec[0]) break; if(vec[n-1] - vec[0] <= 3) { cout << -1 << endl; return 0; } vec[0] += 2; vec[n-1] -= 2; num++; sort(vec.begin(), vec.end()); } cout << num << endl; return 0; }