牛客
/*
裴蜀定理(或贝祖定理)得名于法国数学家艾蒂安·裴蜀,说明了对任何整数a、b和它们的最大公约数d,
关于未知数x和y的线性不定方程(称为裴蜀等式):若a,b是整数,且gcd(a,b)=d,
那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。
*/
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){
if(!b) return a;
else return gcd(b,a%b);
}
int main()
{
ll x,y;
scanf("%lld %lld",&x,&y);
ll ans = gcd(x,y);
printf("%lld\n",ans);
return 0;
}
分析:
题目描述
有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。
输入描述:
第一行一个正整数n ≤ 987654321,表示小朋友的个数.
接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数.
输出描述:
求使所有人获得均等糖果的最小代价。
思路:
开始是n个小孩围成一圈,第i个小孩有ai个糖果(可以自己画个图)。他们的平均值ave就是:总的糖果数/n。可以用Xi表示第i个小孩给了第i-1个小孩Xi个糖果(即,第1个小孩给了第n个小孩X1个糖果,第二个小孩给了第一个小孩X2个糖果)。如果Xi为负数,反过来就是索取了Xi个糖果。
我们这里可以推导出:
a1-X1+X2 = avea1−X1+X2=ave
a2-X2+X3 = avea2−X2+X3=ave
…
an-X(n-1)+X1 = avean−X(n−1)+X1=ave
由上面又可以推出来:
X1-X2 = a1-aveX1−X2=a1−ave
X2-X3 = a2-aveX2−X3=a2−ave
…
Xn-1+Xn = a(n-1)-aveXn−1+Xn=a(n−1)−ave
Xn-X1 = an-aveXn−X1=an−ave
要把这些看成:
Xn = X1 -(ave - an)
Xn-1= X1 - (2ave - an - an-1)
…
X2=X1−((n−1)ave−an−a n−1−…−a2)
X1 =X1−0
我们要算这些每一个左边绝对值的和,在数轴上也就是每个点与点之间的距离.
// -3 -5 -4 -4
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int N = 1e6+7;
ll a[N],b[N];
int main()
{
ll n;
scanf("%lld",&n);
ll avg = 0;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
avg += a[i];
}
avg /= n;
for(int i=n;i>1;i--){
b[i] = avg - a[i] + b[i+1];
}
b[1] = 0;
ll ans = 0;
sort(b+1,b+n+1);
ll mid = b[(n+1)/2];
for(int i=1;i<=n;i++){
ans += abs(b[i]-mid);
}
cout << ans << endl;
return 0;
}
- 水题 题目链接
不论放回与否取到某种物品的概览均不变为n/N。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
int t,a,b,k;
cin >> t;
while(t--){
scanf("%d%d%d",&a,&b,&k);
double ans;
printf("%.3lf\n",b*1.0/(a+b));
}
return 0;
}
注意到这里的2
// //1 1 2 3 5 8 13 21 34 55 89 两奇数 + 一偶数
// //+1/0; 奇数×奇数=奇数. 奇数×偶数=偶数. 偶数×偶数=偶数.
// // 统计偶数的个数.
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
int main()
{
ll a = 0,b = 0;
ll n;
scanf("%lld",&n);
a = n/3;
b = n-a;
ll ans = 0;
ans = a*b + a*(a-1)/2;
printf("%lld\n",ans);
return 0;
}
DP问题,相当于01背包问题
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
char c[502][502];
int dp[502][502];
map<char,int> mp;
int main()
{
mp['l'] = 4;
mp['o'] = 3;
mp['v'] = 2;
mp['e'] = 1;
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin >> c[i][j];
dp[1][1] = mp[c[1][1]];
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
dp[i][j] = max(dp[i][j],dp[i-1][j]+mp[c[i][j]]);
dp[i][j] = max(dp[i][j],dp[i][j-1]+mp[c[i][j]]);
}
}
cout << dp[n][m] << endl;
return 0;
}
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int N = 5e6+3;
int a[N];
int main()
{
int p,q,n;
int t;
int len;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&p,&q,&n);
len = min(q+p,n);
// memset(a,0,sizeof(a));
for(int i=0;i<n;i++){
if(p==0&&q==0) break;
else if(p) a[i] = 5,p--;
else a[i] = 1,q--;
}
if(q){
// int cnt;
for(int i=0;i<n;i++){
if(a[i]<5){
while(q&&a[i]<3){
q--;
a[i]++;
}
}else{
while(q&&a[i]<8){
q--;
a[i]++;
}
}
if(!q) break;
}
}
for(int i=0;i<len;i++){
if(a[i])
printf("%d",a[i]);
}
printf("\n");
}
return 0;
}