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>
排序之后,元素相同就搞一下。
#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;
}
用网络流可以乱搞掉。
把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;
}