Codeforces Round #424 C Jury Marks 思维

来源:互联网 发布:闪字制作软件下载 编辑:程序博客网 时间:2024/06/17 18:26

题目链接



题意:

你有一个初始分数,有k个评委按顺序依次对你的分数进行修改,结束后你记得n个你的分数修改过程中出现过的值。

询问你的初始分数可能有多少种情况。



思路:



这个题当时局限于c题一般就不可以暴力了.忘了数据量....想着逆推,最后也没想明白.还是真菜.


这个题目让我们确定初始的分数,我们知道对于每个记录i,都可能是第j个人打完之后得到的

分数,为此我们要得到初始分数x,就需要记录k个人打分的前缀和,得到分数的变化情况,又因

为多个相同的分数变化对结果无意义,所以进行一个去重。

因为每个b都可能在a的每个位置产生变化,所以说我们只要知道一个b和ai的情况,即可推出

初始分数,进而验证剩下的是否满足.又因为b是互补相同的,当初始分数确定时,对于b他们不

会在同一个位置满足。(这就好比n2的枚举吧,假设你枚举一个bi1,得到在aj1处满足,进而求

得bi2在aj2处满足,那你枚举bi2时得到的结果也是相同的,所以只需要枚举一个b的就可以,当对

所有a的位置都匹配一次,进而得到其他位置的匹配.)


我们假设得到的初试分数为x,分数的变化为s,当前的记录为bi,我们由一个位置推出了初试分数

为x,怎么样验证呢?

我们对于自己求出的分数变化s,有s=bi-x,因为b都不一样,所以得到的分数变化也不相同,我们就看这个s,

有没有在我们记录的前缀和中出现过,如果出现了n个,就满足,否则不满足.

#include<bits/stdc++.h>#define Ri(a) scanf("%d", &a)#define Rl(a) scanf("%lld", &a)#define Rf(a) scanf("%lf", &a)#define Rs(a) scanf("%s", a)#define Pi(a) printf("%d\n", (a))#define Pf(a) printf("%lf\n", (a))#define Pl(a) printf("%lld\n", (a))#define Ps(a) printf("%s\n", (a))#define W(a) while(a--)#define CLR(a, b) memset(a, (b), sizeof(a))#define MOD 1000000007#define inf 0x3f3f3f3f#define exp 0.00000001#define  pii  pair<int, int>#define  mp   make_pair#define  pb   push_backusing namespace std;typedef long long ll;const int maxn=2333;const int base=9999999;int n,k;int a[maxn],b[maxn],sum[maxn];int book[2*base];int main(){Ri(k),Ri(n);for(int i=1;i<=k;i++){Ri(a[i]);sum[i]=sum[i-1]+a[i];book[sum[i]+base]=1;}sort(sum+1,sum+k+1);//去重函数要先排序再去重.k=unique(sum+1,sum+1+k)-(sum+1);for(int i=1;i<=n;i++)Ri(b[i]);int ans=0;for(int i=1;i<=k;i++){int kk=b[1]-sum[i];int cnt=0;for(int j=1;j<=n;j++){cnt+=book[b[j]-kk+base];}if(cnt==n)ans++;}Pi(ans); return 0;}


阅读全文
0 0
原创粉丝点击