Codeforces #304

24 篇文章 0 订阅
18 篇文章 0 订阅

A:

模拟。

/*
──────────────────────────────────────
─▄▄▄───────────▄▄▄▄▄▄▄────────────────
█▀░▀█──────▄▀▀▀░░░░░░░▀▀▄▄────────────
█░░░░█───▄▀░░░░░░░░░░░░░░░▀▄───────▄▄▄
█▄░░░▀▄▄▀░░██░░░░░░░░░░░░░░▀█────█▀▀░█
─█░░░░█▀░░░▀░░░░░░░░██░░░░░░▀█─▄█░░░░█
─▀█░░▄█░░░░░░░▄▄▄░░░░▀░░░░░░░███░░░░█▀
──█▄░█░░░░░▄███████▄░░░░░░░░░█▀░░░░▄▀─
──▀█░█░░░░▄██████████░░░░░░░▄█░░░░▄▀──
───███░░░░███████████░░░░░░▄█░░░░█▀───
────█░░░░░██████████▀░░░░░░█░░░░█▀────
────█░░░░░░▀███████▀░░░░░░░█▄▄▄▀──────
────█░░░░░░░░▀▀▀▀░░░░░░░░░░░▀█────────
────█░░░░░░░░░░░░░░░░░░░░░░░░█────────
────█░░░░░░░░░░░░░░░░░░░░░░░░█────────
────█░░░░░░░░░░░░░░░░░░░░░░░░█────────
──────────────────────────────────────

*/
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#define LL long long
#define db double
#define EPS 1e-15
#define inf 1000000000
#define pa pair<int,int>
using namespace std;

int main(){
    int k, n, w;
    scanf("%d%d%d", &k, &n, &w);
    int sum = 0;
    for (int i=1;i<=w;i++)
        sum+=i*k;

    if(sum>n) printf("%d\n",sum-n);
    else printf("0\n");
    return 0;
}</span>


B:

排序之后,元素相同就搞一下。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#define LL long long
#define db double
#define EPS 1e-15
#define inf 1000000000
#define pa pair<int,int>
using namespace std;

int a[3005];
int main(){
    int n,ans=0;
	scanf("%d",&n);
	for (int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	sort(a+1,a+n+1);
	int t=0;
	for (int i=1;i<=n;i++)
		if (a[i]>t) t=a[i];
		else ans+=t+1-a[i],t++;
	printf("%d\n",ans);
	return 0;
}</span>

C:

正确做法好像是DP……但是我太懒了……暴力模拟了一百万次……

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#define LL long long
#define db double
#define EPS 1e-15
#define inf 1000000000
#define pa pair<int,int>
using namespace std;

queue<int>q1,q2;
void solve(){
	int t1=q1.front(),t2=q2.front();
	q1.pop(), q2.pop();
	if(t1>t2)q1.push(t2),q1.push(t1);
    else q2.push(t1),q2.push(t2);
}
int main(){
    int x,n,k1,k2;
	scanf("%d",&n);
	scanf("%d",&k1);
	for (int i=1;i<=k1;i++){
		scanf("%d",&x);
		q1.push(x);
	}
	scanf("%d",&k2);
	for (int i=1;i<=k2;i++){
		scanf("%d",&x);
		q2.push(x);
	}
	bool flag=0;
	for (int i=1;i<=1000000;i++){
		solve();
		if (q1.empty() || q2.empty()){
			printf("%d ",i);
			if (q1.empty()) puts("2");
			else puts("1");
			flag=1;
			break;
		}
	}
	if (!flag) puts("-1");
	return 0;
}</span>

D:

用筛法得出每个数质因子个数,然后求前缀和即可。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#define LL long long
#define db double
#define EPS 1e-15
#define inf 1000000000
#define pa pair<int,int>
using namespace std;

int n,a,b,cnt;
int pri[1000005],sum[5000005];
bool mark[5000005];
void pre(){
	for (int i=2;i<=5000000;i++){
		if (!mark[i]) pri[++cnt]=i,sum[i]=1;
		for (int j=1;j<=cnt && pri[j]*i<=5000000;j++){
			mark[pri[j]*i]=1;
			sum[pri[j]*i]=sum[i]+1;
			if (i%pri[j]==0) break;
		}
	}
	for (int i=2;i<=5000000;i++) sum[i]+=sum[i-1];
}
int main(){
	pre();
	scanf("%d",&n);
	while (n--){
		scanf("%d%d",&a,&b);
		printf("%d\n",sum[a]-sum[b]);
	}
	return 0;
}


E:

用网络流可以乱搞掉。

把i点拆成ai和bi两个点,加源点和汇点,源点到ai连a[i]的流量,ai到bi连INF(表示不动的士兵),bi到汇点连b[i]的流量。

对于x到y的每条边连ax到by,ay到bx,流量为INF的边(士兵移动)。跑出最大流看是否等于a[i]或b[i]之和。

对于输出方案,最大流跑完之后,遍历一遍所有的点,如果流量为flow且大于0的边,则这条边上有flow个士兵流过。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#define LL long long
#define db double
#define EPS 1e-15
#define inf 1000000000
#define pa pair<int,int>
using namespace std;

int n,m,cnt=1,T,sum,sum2,ans;
int h[205],last[205],q[205],a[105],b[105];
int f[105][105];
struct edge{
    int to,next,w;
}e[1000005];
void insert(int u,int v,int w){
	e[++cnt]=(edge){v,last[u],w}; last[u]=cnt;
	e[++cnt]=(edge){u,last[v],0}; last[v]=cnt;
}
bool bfs(){
	int head=0,tail=1;
	memset(h,-1,sizeof(h));
	q[0]=0; h[0]=0;
	while (head!=tail){
		int x=q[head]; head++;
		for (int i=last[x];i;i=e[i].next)
			if (h[e[i].to]==-1 && e[i].w){
				h[e[i].to]=h[x]+1;
				q[tail++]=e[i].to;
			}
	}
	return h[T]!=-1;
}
int dfs(int x,int f){
	if (x==T) return f;
	int w,used=0;
	for (int i=last[x];i;i=e[i].next)
		if (h[e[i].to]==h[x]+1){
			w=dfs(e[i].to,min(e[i].w,f-used));
			e[i].w-=w; e[i^1].w+=w;
			used+=w;
			if (used==f) return f;
		}
	if (!used) h[x]=-1;
	return used;
}
int main(){
	scanf("%d%d",&n,&m);
	T=2*n+1;
	for (int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		insert(0,i,a[i]);
		insert(i,i+n,inf);
		sum+=a[i];
	}
	for (int i=1;i<=n;i++){
		scanf("%d",&b[i]);
		insert(i+n,T,b[i]);
		sum2+=b[i];
	}
	for (int i=1;i<=m;i++){
        int u,v;
		scanf("%d%d",&u,&v);
		insert(u,v+n,inf);
		insert(v,u+n,inf);
	}
	while (bfs()) ans+=dfs(0,inf);
	if (ans==sum && ans==sum2){
		puts("YES");
		for (int i=1;i<=n;i++)
			for (int j=last[i];j;j=e[j].next)
				if (e[j].to>n) f[i][e[j].to-n]=e[j^1].w;
		for (int i=1;i<=n;i++){
			for (int j=1;j<=n;j++)
				printf("%d ",f[i][j]);
			puts("");
		}
	}
	else puts("NO");
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值