10-15模拟赛记

10-15 考试记

7点开始考试。

第一题大模拟,先跳过。

第二题,裸的背包啊,价值转到下标,切掉切掉。

死亡
(death.pas/c/cpp)
题目背景
众所不周知的是,酒店之王 xkj 一个经常埋葬死去自己的人
当 TA 再一次从迷失的困境之中走出来的时候,TA 被某锤姓男子告知:“你违纪了”
违纪就意味着精神的死亡,灵魂的无处安放
也许这才是最好的归途...... 题目描述
xkj 的灵魂不断的飘荡,飘荡到了食堂的打饭口,TA 无助的望了一眼,下定决心:先把肚
第 4 页 共 4页
子填饱再说
食堂现在还有 n个食物,每一个食物都有一个美味程度wi,但是同样也存在一个费用
vi,xkj 当然希望吃到美食的美味程度总和最大,但是想必你也知道,TA 的饭卡最近有一
些拮据最多只可以消费 W 元,由于 TA 的灵魂在飘荡的时候忘记了带上脑子(唉,脑子是
一个好东西),所以 TA 找到了还在站级部的 cdy,希望 cdy 帮 TA 计算一下,TA 在饭卡不破
产的情况下,该如何消费使自己吃到食物的美味程度总和最大
输入格式
第一行一个整数 n 表示一共有 n 个食物
接下第 2 行至第 n+1 行每行两个整数 vi,wi 表示该食物的费用以及美味程度
最后一行一个整数 W 表示最多可以消费 W 元
输出格式
一行,表示合法消费情况下的最大美味程度总和
样例输入
4
2 3
1 2
3 4
2 2
5
样例输出
7
样例解释
选择 1,3,4 号物品
温馨提示
这不就是一个裸的 01 背包吗??????
数据范围
保证对于 100%的数据
1<=n<=100 1<=wi<=1000 1<=vi<=10^7 1<=W<=10^9

果真全场切。。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define int long long
using namespace std;
const int wx=200017;
inline int read(){
	int sum=0,f=1; char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0';ch=getchar();}
	return sum*f;
}
int n,m,tot_w;
int w[wx],v[wx],f[wx*5];
signed main(){
	freopen("death.in","r",stdin);
	freopen("death.out","w",stdout);
	
	n=read();
	
	for(int i=1;i<=n;i++){
		v[i]=read();w[i]=read();
		tot_w+=w[i];
	}
	
	m=read();
	memset(f,0x3f,sizeof f);
	f[0]=0;
	
	for(int i=1;i<=n;i++){
		for(int j=tot_w;j>=w[i];j--){
			f[j]=min(f[j],f[j-w[i]]+v[i]);
		}
	}
	
	for(int i=tot_w;i>=0;i--){
		if(f[i]<=m){
			printf("%lld\n",i);
			return 0;
		}
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}

第三题是出题大佬讲过的原题,两个月前的吧。。。

刚开始做的时候没想到是原题,一直在YY传递闭包,后来发现是一道原题,直接贪心完事。

%%% lzxkj给衡二校内互坑赛开了多合一题的先河。

code:

#include <iostream>
#include <cstdio>
#include <algorithm>
#define int long long
using namespace std;
const int wx=200017;
inline int read(){
	int sum=0,f=1; char ch=getchar();
	while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar();}
	while(ch>='0'&&ch<='9'){ sum=(sum<<1)+(sum<<3)+ch-'0'; ch=getchar();}
	return sum*f;
}
int n,ans,ANS,temp,tot,tmp,minn=2147483642;
int b[wx],sum[wx],w[wx];
struct node{
	int v,id;
	friend bool operator < (const node& a,const node& b){
		return a.v<b.v;
	}
}a[wx];
void add(int pos,int k){
	for(int i=pos;i<=n;i+=(i&-i)){
		sum[i]+=k;
	}
}
int query(int x){
	int re=0;
	for(int i=x;i>=1;i-=(i&-i)){
		re+=sum[i];
	}
	return re;
}
signed main(){
	freopen("relive.in","r",stdin);
	freopen("relive.out","w",stdout);
	n=read();
	for(int i=1;i<=n;i++)a[i].v=read(),a[i].id=i,w[i]=a[i].v,minn=min(minn,w[i]);
	sort(a+1,a+1+n);
	for(int i=1;i<=n;i++)b[a[i].id]=i;
	for(int i=1;i<=n;i++){
		add(b[i],1);
		ans+=(i-query(b[i]));
	}
	for(int i=1;i<=n;i++){
		if(a[i].id==i)continue;
		int k=a[i].id; 
		tot=w[i]; temp=1;
        a[i].id=i; 
		tmp=w[i];
        while(k!=i){
        	temp++;tmp=min(tmp,w[k]);
        	tot+=w[k];
        	swap(a[k].id,k);
        }
        if(tmp==minn)
			ANS+=tot+tmp*(temp-2);
        else 
			ANS+=min(minn*(temp+1)+tmp+tot,tot+tmp*(temp-2));
	}
	for(int i=1;i<=n;i++)printf("%lld ",a[i].v);
	puts("");
	printf("%lld\n%lld\n",ans,ANS);
	fclose(stdin);
	fclose(stdout);
	return 0;
}

第一题模拟太难受了,最后丢掉了10分。

90分code:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std; 
inline int read(){
	int sum=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0';ch=getchar();}
	return sum*f;
}
const int wx=1500017;
char zmj[wx],wtx[wx];
int main(){
	freopen("lzxkj.in","r",stdin);
	freopen("lzxkj.out","w",stdout);
    	scanf("%s",zmj);  
        int len=strlen(zmj);
        int tmp1=0,tmp2=0,tmp3=0;  
        int flag=0;
        if(len==1&&zmj[0]=='0'){
			printf("0\n");return 0;
        }
        else if(len==2&&zmj[0]=='-'&&zmj[1]=='0'){
			printf("0\n");return 0;
        }
        for(int i=0;i<len;i++)if(zmj[i]=='-')flag=1;
        if(flag)printf("-");
        for(int i=len-1;i>=0; i--)  
            if(zmj[i]>'0'&&zmj[i]<='9'){  
                tmp3=i;  
                break;  
            }  
        for(int i=0;i<len;i++)  
            if(zmj[i]>'0'&&zmj[i]<='9'){  
                tmp1=i;
                break;  
            }  
        for(int i=0;i<len;i++)  
            if(zmj[i]=='.'){  
                tmp2=i;  
                break;  
            }  
        if(tmp1==tmp3&&tmp1==0){  
            if(zmj[tmp1]=='0')printf("0\n");  
            else{  
                printf("%c",zmj[tmp1]);  
                if(tmp2==0){
                    printf("E%d\n",len-1);  
                }  
                else{ 
				    printf("E%d\n",tmp2-tmp1-1);  
                }  
            }  
            return 0;
        }  
        if(tmp2==0){
            if(zmj[0]=='.'){  
                for(int i=tmp1;i<=tmp3;i++){
                    printf("%c",zmj[i]);  
                    if(i==tmp1&&tmp1!=tmp3)printf(".");  
                }
                printf("E%d\n",tmp2-tmp1);  
            }  
            else{  
                for(int i=tmp1;i<=tmp3;i++){  
                    printf("%c",zmj[i]);  
                    if(i==tmp1&&tmp1!=tmp3)printf(".");  
                } 
			    printf("E%d\n",len-tmp1-1);  
            }  
        }  
        else{  
            if(tmp2<tmp1){  
                for(int i=tmp1;i<=tmp3;i++){  
                    printf("%c",zmj[i]);  
                    if(i==tmp1&&tmp1!=tmp3)printf(".");  
                }  
                printf("E%d\n",tmp2-tmp1);  
            }  
            else if(tmp2>=tmp1&&tmp2<=tmp3){  
                for(int i=tmp1;i<=tmp3;i++){  
                    if(zmj[i]=='.')continue;  
                    printf("%c",zmj[i]);
					if(i==tmp1)printf(".");  
                }
                printf("E%d\n",tmp2-tmp1-1);  
            }
            else{  
                for(int i=tmp1;i<=tmp3;i++)  
                {  
                    if(zmj[i]=='.')continue; 
                    printf("%c",zmj[i]);  
                    if(i==tmp1&&tmp1!=tmp3)printf(".");  
                }
                if(tmp2-tmp1==1)return 0; 
                printf("E%d\n",tmp2-tmp1-1);  
            }
        }
    	fclose(stdin);
    	fclose(stdout);
    	return 0;  
}  

总结:题简单,T2全场切。

​ 三个AK大佬第一题模拟居然打出来了。。。强强强。

​ 290十分,还可以吧,继续加油。

posted @ 2018-10-15 10:56  _王小呆  阅读(161)  评论(0编辑  收藏  举报