exam
简单的贪心
注意细节,long long就可以ac了1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define D "%lld"
#define prf printf
#define scf scanf
#define ll long long
ll n,r,v,t,tot,ans;
struct stu{
ll x,y;
}s[199999];
int cmp(const stu a,const stu b){
if(a.y<b.y)
return 1;
return 0;
}
int main()
{
freopen("exam.in","r",stdin);
freopen("exam.out","w",stdout);
scf(D D D,&n,&r,&v);
for(int i=1;i<=n;i++)
{
scf(D D,&s[i].x,&s[i].y);
ans+=s[i].x;
}
sort(s+1,s+n+1,cmp);
while(ans<v*n)
{
t++;
if((ans+(r-s[t].x))<=v*n)
ans+=r-s[t].x,tot+=(r-s[t].x)*s[t].y;
else tot+=(v*n-ans)*s[t].y,ans=v*n;
}
prf(D,tot);
}
lift
电梯,之前不懂什么叫滚动数组,现在明白了
就是用两个数组,防止重复使用空间
这个题是动态规划
很容易想到
f[j]+=f[i]
j是每一个可以由i扩展到的地方
这样就可以用n^3的算法做了
第一层枚举第几次乘电梯
第二层枚举当前位置
第三层枚举可以到的电梯,加上值
这样能过60的数据
但区间加值可以用差值维护来优化这样局可以n^2完成了,就ac了
注意要减去之前的值因为转移出去的话要清零
601
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#define ll long long
using namespace std;
ll tot;int n,a,b,k;
const int p=1000000007;ll f[5099],w[5999];
int main()
{
freopen("lift.in","r",stdin);
freopen("lift.out","w",stdout);
scanf("%d%d%d%d",&n,&a,&b,&k);
f[a]=1;
for(int i=1;i<=k;i++)
{
for(int j=1;j<=n;j++)
{
if(j!=b&&f[j])
{
for(int q=1;q<abs(j-b);q++)
{
if(j+q!=b)
w[j+q]+=f[j],w[j+q]%=p;
if(j-q!=b)
w[j-q]+=f[j],w[j-q]%=p;
}
}
}
for(int j=1;j<=n;j++)
{
f[j]=w[j];
w[j]=0;
}
}
for(int i=1;i<=n;i++)
{
tot+=f[i];
tot%=p;
}
printf("%lld",tot%p);
fclose(stdin);
fclose(stdout);
return 0;
}
100
1 | #include<cstdio> |
game
枚举一个小局的t
用二分查找找先的t分的,统计胜的局数
胜的多的就是答案
但有几种情况不行
1.两人胜的局数相同
2.胜得多的不是最后胜的
3.打到最后也没结束
这样就可以做完了
1 | #include<cstdio> |