牛客每日练习----杯子,Wasserstein Distance,数字游戏

我喜欢给自己压力,必须得定一个很高的目标,逼自己朝着这个目标前进,不管会不会实现,都是一个动力。                                      ----喻言

链接:https://ac.nowcoder.com/acm/problem/15559
来源:牛客网

题目描述

一天durong同学买了一个无限长的杯子,同时买了n个球,并且标号为1,2,3......n,durong同学突然想到一个问题----如果他把n个球依次,也就是按照1,2,3...n的顺序放进杯子里,然后在全部拿出来(注意不一定要等到全部放进去才能拿出球),并且会记录放进和拿出球的顺序,
durong想知道,要满足当第m个球进去后,杯子中此时恰好有k个球,然后仍然要把剩下的n-m个球放进去,最后杯中的球要取光,这样的放进和拿出球的顺序有多少种,答案有可能很大,所以mod上1e9+7

输入描述:

1<=n,m,k<=1e6(m可能大于n,k可能大于m)
第一行一个正整数T,表示数据组数。(1<=T<=10000)
对于每组数据包含一行三个正整数n,m,k。

输出描述:

对于每组数据输出一个正整数表示答案。
由于答案可能过大,所以只需要输出对1e9+7取模后的答案

示例1

输入

复制

2
3 3 3
3 3 2

输出

复制

1
2
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include//INT_MAX
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3fll
#define dinf 1000000000000.0
typedef long long ll;
using namespace std;
int const N=2000010;
int const mod=1e9+7;
int n,m,k;
ll fac[N],fg[N];
ll ksm(ll a,ll b,ll mod){
	ll ans=1;
	while(b){
		if(b&1)	
			ans=ans*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ans;
}
void init(){
	fac[0]=1;
	for(int i=1;i=0;i--)
		fg[i]=fg[i+1]*(i+1)%mod;
}
ll C(int n,int m){
	if(nn||k>m){
			printf("0\n");
			continue;
		}
		printf("%lld\n",cantan(m-1,m-k)*cantan(n-(m-k),n-m)%mod);
	}
	return 0;
}

链接:https://ac.nowcoder.com/acm/problem/15564
来源:牛客网

题目描述

最近对抗生成网络(GAN)很火,其中有一种变体WGAN,引入了一种新的距离来提高生成图片的质量。这个距离就是Wasserstein距离,又名铲土距离。

这个问题可以描述如下:

有两堆泥土,每一堆有n个位置,标号从1~n。第一堆泥土的第i个位置有ai克泥土,第二堆泥土的第i个位置有bi克泥土。小埃可以在第一堆泥土中任意移挪动泥土,具体地从第i个位置移动k克泥土到第j个位置,但是会消耗k⋅∣i−j∣k\cdot\left| i-j \right|k⋅∣i−j∣的体力。小埃的最终目的是通过在第一堆中挪动泥土,使得第一堆泥土最终的形态和第二堆相同,也就是ai=bi (1<=i<=n), 但是要求所花费的体力最小

 

左图为第一堆泥土的初始形态,右图为第二堆泥土的初始形态,颜色代表了一种可行的移动方案,使得第一堆泥土的形态变成第二堆泥土的形态

输入描述:

输入测试组数T,每组测试数据,第一行输入n,1<=n<=100000,紧接着输入两行,每行n个整数,前一行为a1, a2,…,an,后一行为b1,b2,…,bn.其中0<=ai,bi<=100000,1<=i<=n,数据保证 ∑i=1nai=∑i=1nbi\sum_{i=1}^{n}{a_{i}}=\sum_{i=1}^{n}{b_{i}}∑i=1n​ai​=∑i=1n​bi​

输出描述:

对于每组数据,输出一行,将a土堆的形态变成b土堆的形态所需要花费的最小体力

示例1

输入

复制

2
3
0 0 9
0 2 7
3
1 7 6
6 6 2

输出

复制

2
9

备注:

输入数据量较大,建议使用scanf/printf
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include//INT_MAX
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3fll
#define dinf 1000000000000.0
typedef unsigned long long ll;
using namespace std;
const ll mod=998244353;  
const int NM=100000+500;
using namespace std;
int t;
ll a[NM],b[NM];
ll jc(int n){
    ll ans=0;
    for(int i=1;i<=n;i++){
        if(a[i]>=b[i]){
            a[i+1]+=a[i]-b[i];
            ans+=a[i]-b[i];
            a[i]=b[i];
        }
		else{
            b[i+1]+=b[i]-a[i];
            ans+=b[i]-a[i];
            b[i]=a[i];
        }
    }
    return ans;
}
int main(){
    scanf("%d",&t);
    while(t--){
    	int n;
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        scanf("%d",&n);
        for(int i=1;i<=n;i++) 
			scanf("%lld",&a[i]);
        for(int i=1;i<=n;i++) 
			scanf("%lld",&b[i]);
        printf("%lld\n",jc(n));
    }
    return 0;
}

链接:https://ac.nowcoder.com/acm/problem/15565
来源:牛客网

题目描述

小埃和小森在玩一个数字游戏,小埃先从区间[L1, R1]里选择1个数字n1,小森看到小埃选的数字后,从[L2,R2]里选择1个数字n2, 将n1和n2连接在一起(n1在前, n2在后),形成一个新的数字,若这个数字可以被mod整除,那么小森获胜,否则小埃获胜。若两个人均采取最优策略,试问谁获胜?

输入描述:

输入测试组数T,每组数据,输入一行整数L1, R1, L2, R2, mod,其中1<=L1<=R1<109,1<=L2<=R2<109, 1<=mod<=106

输出描述:

每组数据输出一行,若小埃获胜,输出WIN,否则输出LOSE

示例1

输入

复制

2
6 9 3 5 1
5 10 7 8 6

输出

复制

LOSE
WIN
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include//INT_MAX
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3fll
#define dinf 1000000000000.0
typedef unsigned long long ll;
using namespace std;
const ll mod=998244353;  
const int NM=2e5+10;
using namespace std;
const int maxn=2e5+5;
int main() {
    int t, l1, l2, r1, r2, md;
    cin>>t;
    while(t--){
        cin >>l1>>r1>>l2>>r2>>md;
        if(r2-l2>=md-1)
            cout<<"LOSE"<

你可能感兴趣的:(牛客网)