A题
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define clr(x) memset(x,0,sizeof(x))
int a[3000];
int f[3000];
int main()
{
int n,res,i;
while(scanf("%d",&n)!=EOF)
{
res=0;
clr(f);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
f[a[i]]++;
}
for(i=0;i<3000;i++)
{
if(f[i]>res)res=f[i];
}
if(n%2==0)n=n/2;
else n=n/2+1;
if(res>n)printf("NO\n");
else printf("YES\n");
}
return 0;
}
C题
题意:
一个数组n个数,然后又m组操作,每组操作是将从l到r 的每个元素值加v,然后是k组操作,每组的意思是执行第x、x+1……y组操作,然后输出数组元素。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define clr(x) memset(x,0,sizeof(x))
long long a[100010];
struct node
{
int l,r;
long long d;
}q[100010];
long long f1[100010];
long long sum1[100010];
long long res[100010];
int main()
{
int n,m,k,i,u,v;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
clr(f1);
clr(sum1);
clr(res);
for(i=1;i<=n;i++){
scanf("%I64d",&a[i]);
}
for(i=1;i<=m;i++){
scanf("%d%d%I64d",&q[i].l,&q[i].r,&q[i].d);
}
for(i=0;i<k;i++){
scanf("%d%d",&u,&v);
f1[u]++;
f1[v+1]--;
}
for(i=1;i<=m;i++){
sum1[i]=sum1[i-1]+f1[i];
}
for(i=1;i<=m;i++){
res[q[i].l]+=q[i].d*sum1[i];
res[q[i].r+1]-=q[i].d*sum1[i];
}
for(i=1;i<=n;i++)
{
res[i]+=res[i-1];
printf("%I64d ",res[i]+a[i]);
}
printf("\n");
}
return 0;
}