1. 程式人生 > >NOIP 考後歡樂賽 T1 Mr.Lee 的評測機

NOIP 考後歡樂賽 T1 Mr.Lee 的評測機

連結

https://www.luogu.org/problemnew/show/U54181


大意

n n 個東西和一個一秒能算 P P 下的評測機,選擇某個東西需要花費 T

i T_i 點時間使得評測機每秒多計算 n u m i num_i
次,有 K K 道題,A掉第 i i 道題需要在 t i
t_i
點時間內完成 w i w_i 次運算,問升級後的評測機能A掉幾道題
...


思路

用01揹包求出 M M 時間內最多能升級的 n u m num ,後面 O ( n ) O(n) 掃描即可


程式碼

#include<algorithm>
#include<cstdio>
#include<cctype>
using namespace std;int f[30001],n,m,k,p,c,v,t,w,ans;
inline char Getchar()
{
    static char buf[100000],*p1=buf+100000,*pend=buf+100000;
    if(p1==pend)
	{
        p1=buf; pend=buf+fread(buf,1,100000,stdin);
        if (pend==p1) return -1;
    }
    return *p1++;
}
inline int read()
{
	char c;int d=1,f=0;
	while(c=Getchar(),!isdigit(c))if(c==45)d=-1;f=(f<<3)+(f<<1)+c-48;
	while(c=Getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;
	return d*f;
}
inline void write(register long long x)
{
	if(x<0)write(45),x=-x;
	if(x>9)write(x/10);
	putchar(x%10+48);
	return;
}//以上為輸入輸出優化
signed main()
{
	n=read();m=read();k=read();p=read();
	for(register int i=1;i<=n;i++)
	{
		v=read();c=read();
		for(register int j=m;j>=v;j--) f[j]=max(f[j],f[j-v]+c);//01揹包
	}
	p+=f[m];//評測機升級
	for(register int i=1;i<=k;i++)
	{
		t=read();w=read();
		if(t*p>=w) ans++;//能A掉
	}
	if(ans==k) puts("AC");else
	write(ans);
}