在一台大型机器上有n个指示灯,不同位置指示灯明暗可以表示机器处于何种状态,工程师在对机器操作完之后要手动设置指示灯的明暗用来指示机器的工作状态。每个指示灯都有一个单独开关将灯的明暗状态反置,即亮变暗,暗变亮。此外还有三个开关,开关1将所有的指示灯变亮,开关2将所有的指示灯变暗,开关3将所有的指示灯明暗状态反置。
假如你是将要操作这台机器的工程师,你知道机器上指示灯初始状态和你要设定的状态,你想知道最少需要按多少次开关才能将指示灯状态设置成你要设定的状态。
有一辆最大载重M公斤的卡车和N种货物,已知第i种货物有wi公斤,其总价值为vi元。每种货物都可以取任意数量装入卡车。试确定装货方案,使得装入卡车的所有物品总价值最大。
第一行是两个整数M,N(0<M,N<100000)。接下来的N行,每一行有两个整数wi,vi(0<wi<=100,0<vi<=100),分别代表第i种货物的总重量和总价值。
输出卡车能装入货物的最大价值,保留6位小数。
10 3
10 10
5 6
20 50
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; }
在一台大型机器上有n个指示灯,不同位置指示灯明暗可以表示机器处于何种状态,工程师在对机器操作完之后要手动设置指示灯的明暗用来指示机器的工作状态。每个指示灯都有一个单独开关将灯的明暗状态反置,即亮变暗,暗变亮。此外还有三个开关,开关1将所有的指示灯变亮,开关2将所有的指示灯变暗,开关3将所有的指示灯明暗状态反置。
假如你是将要操作这台机器的工程师,你知道机器上指示灯初始状态和你要设定的状态,你想知道最少需要按多少次开关才能将指示灯状态设置成你要设定的状态。
输入第一行是一个整数表示测试组数。
接下来两行各有一个字符串分别表示机器上的初始状态和你要设定的状态。其中指示灯状态是用01字符串表示的,‘0’表示灯暗,1表示灯亮。字符串的长度不超过100。
对每组测试数据输出一个整数表示最小需要按的开关次数。
1
10010
01111
2
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; }