Problem - A - Codeforces
题目大意:给定一个长度为n的序列,你可以向序列中添加任意个非负数,来使得序列的平均值为1,求最小添加的个数.
思路:非三类讨论
- 当前序列中的所有数的和为负数或者是小于长度n,那么只需要添加一项即可.
- 当前序列中的所有数的都等于1,那么则不需要添加任何数,
- 当前序列中的所有数之和大于长度n,那么这时应该只添加0,并且每一次添加都可以使得当前序列长度加一,当添加到该序列长度为所有数之和时即可.
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(x,y,z) for(int x=y;x<=z;++x)
#define dec(x,y,z) for(int x=y;x>=z;--x)
#define IOS ios::sync_with_stdio(0)
ll t, n;
ll a[55];
int main(){
IOS;
cin>>t;
while(t--){
cin>>n;
ll cnt = 0;
rep(i,1,n){
cin>>a[i];cnt += a[i];}
if (cnt < n)cout << "1" <<endl;
else if (cnt == n)cout << 0 <<endl;
else cout << cnt - n <<endl;
}
return 0;
}
Problem - B - Codeforces
题目大意:给定一个平面,和一个人的初始坐标,你可以设置两个位置,来让其前往,请通过合理的设置来使得该人的行走距离尽可能地大,输出两个位置的坐标.
思路:首先该人到达两个位置的距离分别是abs(x - x1) + abs(y - y1) + abs(x - x2) + abs(y - y2).为了使绝对值尽可能地大,则应该将两个位置设在对角线上,这里有一个小坑,对角线有两组,你可能会因为当前人和某个角落重合而去选择另一组对角线,但是该位置可以和人的初始位置重合,所以无论哪种情况只需要输出任意一组即可.
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(x,y,z) for(int x=y;x<=z;++x)
#define dec(x,y,z) for(int x=y;x>=z;--x)
#define IOS ios::sync_with_stdio(0)
int t;
ll n, m, x, y;
int main(){
cin>>t;
while