XMU1316.卡车装货以及1345.机器的指示灯 垃圾水题 给我的反思 又犯了一次

1316.卡车装货
Time Limit: 1000 MS         Memory Limit: 65536 K
Total Submissions: 516 (104 users)         Accepted: 117 (93 users)
[ My Solution]
Description

有一辆最大载重M公斤的卡车和N种货物,已知第i种货物有wi公斤,其总价值为vi元。每种货物都可以取任意数量装入卡车。试确定装货方案,使得装入卡车的所有物品总价值最大。

Input

第一行是两个整数M,N(0<M,N<100000)。接下来的N行,每一行有两个整数wi,vi(0<wi<=100,0<vi<=100),分别代表第i种货物的总重量和总价值。

Output

输出卡车能装入货物的最大价值,保留6位小数。

Sample Input

10 3

10 10

5 6

20 50

Sample Output

25.000000


猛的一看还以为是背包 就使劲的用背包 搞 但是没有搞出25是怎么得到的

其实这不是个背包问题 而是贪心    就是因为不仔细看题 以及没有分析样例造成的做了很多无用功

最重要的是没有看清测试样例 就直接写程序

以前也经常犯这样的错误 等把程序写好了 忽然发现样例不对  然后发现 原来看错题了 

这下就辛苦努力数十年 一朝回到解放前

多多做这么多无用功 还不如认真读题

分析样例  



教训:以后每做一个题 都要搞清楚样例是如何得到的之后才能拍代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct haha
{
	double cost;
	double val;
	double cmp;
}a[1000000+100];
int bag[100000];
int cp(const void *a,const void *b)
{
	return (*(struct haha*)b).cmp>(*(struct haha*)a).cmp?1:-1;
}
int main()
{
    int m,i;
	double ans,n;
	while(scanf("%lf %d",&n,&m)!=EOF)
	{
		ans=0;
          for(i=0;i<m;i++)
		  {
			  scanf("%lf %lf",&a[i].cost,&a[i].val);
			  a[i].cmp=a[i].val/a[i].cost;
		  }
		  qsort(a,m,sizeof(a[0]),cp);
		  for(i=0;i<m;i++)
		  {
			  if(n<=0) break;
			  if(a[i].cost<=n)
			  {
				  ans+=a[i].val;n=n-a[i].cost;
			  }
			  else
			  {
                   ans+=a[i].cmp*n;n=0;
			  }
		  }
		  printf("%lf\n",ans);
	}
	return 0;
}


1345.机器的指示灯
Time Limit: 1000 MS         Memory Limit: 65536 K
Total Submissions: 365 (136 users)         Accepted: 123 (113 users)
[ My Solution ]

Description

在一台大型机器上有n个指示灯,不同位置指示灯明暗可以表示机器处于何种状态,工程师在对机器操作完之后要手动设置指示灯的明暗用来指示机器的工作状态。每个指示灯都有一个单独开关将灯的明暗状态反置,即亮变暗,暗变亮。此外还有三个开关,开关1将所有的指示灯变亮,开关2将所有的指示灯变暗,开关3将所有的指示灯明暗状态反置。
假如你是将要操作这台机器的工程师,你知道机器上指示灯初始状态和你要设定的状态,你想知道最少需要按多少次开关才能将指示灯状态设置成你要设定的状态。

Input

输入第一行是一个整数表示测试组数。
接下来两行各有一个字符串分别表示机器上的初始状态和你要设定的状态。其中指示灯状态是用01字符串表示的,‘0’表示灯暗,1表示灯亮。字符串的长度不超过100。

Output

对每组测试数据输出一个整数表示最小需要按的开关次数。

Sample Input

1
10010
01111

Sample Output

2

Hint

10010先全部置1,变成11111,然后第一位置成0。只要需要按2次开关。


不看样例   老是不看样例    以后拿到样例要认真分析出来是如何得到的  而不是看一眼就过

一开始 没有仔细研究样例 以为就只有3中操作    二话不说DFS BFS  等回来怎么都不对的时候一看样例 原来不是 那回事

注意: 千千万万把样例搞出来 弄明白为什么 再去做题 否则肯定吃亏

#include<stdio.h>
#include<string.h>
int main()
{
	int cas,i,j;
	char s1[120],s2[120],s3[120],s[120],s4[120];
	int cnt1,cnt4,cnt2,cnt3;
	scanf("%d",&cas);
	while(cas--)
	{
		int ans=999999999;
		scanf("%s",s1);
		scanf("%s",s);	
		for(i=0;s1[i]!='\0';i++)
		{
			s2[i]='1';
			s3[i]='0';
		}
		
		for(i=0;s1[i]!='\0';i++)
			s4[i]=!(s1[i]-'0')+'0';
		s4[i]=s3[i]=s2[i]='\0';
		cnt1=0;cnt4=cnt2=cnt3=1;
	
		for(i=0;s[i]!='\0';i++)
		{
             if(s1[i]!=s[i]) cnt1++;
			 if(s2[i]!=s[i]) cnt2++;
			 if(s3[i]!=s[i]) cnt3++;
			 if(s4[i]!=s[i]) cnt4++;
			// printf("i=%d\n",i);
		}
	//	printf("%d %d %d %d\n",cnt1,cnt2,cnt3,cnt4);
		if(ans>cnt1) ans=cnt1;
		if(ans>cnt2) ans=cnt2;
		if(ans>cnt3) ans=cnt3;
		if(ans>cnt4) ans=cnt4;
		printf("%d\n",ans);	
	}
	return 0;
}




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值