假设商品价格为x
618:int(x*0.66)
211:x-(x/100)*35
两者比较一下大小即可
#include
using namespace std;
int x,x1,x2;
int main(){
scanf("%d",&x);
x1 = x*0.66;
x2 = x-(x/100)*35;
if (x1 == x2) printf("both\n%d",x1);
if (x1 > x2) printf("211\n%d",x2);
if (x1 < x2) printf("618\n%d",x1);
return 0;
}
利用两个变量分别存储跳舞的天数和不跳舞的天数
如果跳舞的天数大于不跳舞的天数,那就是YES,否则就是NO
然后再把两个变量输出就可以
#include
using namespace std;
int n;
int sl,sy;
int main(){
scanf("%d",&n);
for (int i = 1; i <= n; i++){
int x; cin>>x;
if (x == 0) sl++; else sy++;
}
if (sy > sl) printf("YES\n%d %d",sy,sl);
else printf("NO\n%d %d",sy,sl);
return 0;
}
假设一个数x
令S= x 2 x^2 x2
如何从S的末尾中取出和x相同位数的数呢?
我们需要知道x的位数为m
那么令S% 1 0 m 10^m 10m就能得到末尾的数
如果相同,那么就是自守数,累加后输出即可
#include
using namespace std;
int a,b,cnt;
int f[101000];
bool Check(int x){
int X = x*x,XX = x;
int xx = 1;
while (x) xx*=10,x/=10;
if (X%xx == XX) return 1;
return 0;
}
void Work(int x){
if (Check(x)) f[++cnt] = x;
return;
}
int main(){
scanf("%d %d",&a,&b);
for (int i = a; i <= b; i++) Work(i);
printf("%d\n",cnt);
for (int i = 1; i <= cnt; i++) printf("%d\n",f[i]);
}
首先看题目:
这个油管是东西向的
所以我们只需要考虑油田的纵坐标而不需要管横坐标
那么如何放置主管道才能使距离和最小呢?
我们假设先把油管放到最下面的油井中
此时得到一个距离 S S S
那么,我们将管道往上移一格
此时距离会变成多少呢?
不难想出
此时,第一个油井到他的距离会多1,而第2~n个油井的距离到他的距离就会少1
减少的距离大于增加的距离,就意味着我们仍然可以往上移
于是我们一直移……
移到什么时候,减少的会和增加的相等,或者减少的会小于增加的呢?
不难想到,就是中间的时候,减少的会等于增加的,再上去,减少的就会小于增加的,距离就会变长了
所以,距离最小的时候,就是把主管道放在中位数位置的时候。
那么知道主管道的位置了,距离和算一下也就简单了
#include
using namespace std;
const int N = 1e5+100;
int n;
int a[N],ans = 0;
int main(){
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
scanf("%d",&n);
for (int i = 1; i <= n; i++) scanf("%d %d",&a[i],&a[i]);
sort(a+1,a+n+1);
int d = a[(1+n)/2];
for (int i = 1; i <= n; i++) ans+=abs(d-a[i]);
printf("%d",ans);
}
01背包即可,不再赘述
贪心
贪心策略1毫无疑问,我们肯定希望吃到尽可能美味的鱼
因此我们需要将体积1的鱼和体积2的鱼分别按照美味值从大到小排序。
接下来如何贪心呢?
首先我们用体积为2的鱼将背包都填满,如果体积还剩余,那么再用体积为1的鱼去补上余下体积
这时候有的同学就会问了;
我们难道只用体积为2的鱼,体积为1的鱼不用了吗?
非也,
我们知道,两条体积为1的鱼可以去代替一条体积为2的鱼
所以,
我们先用体积为2的鱼填满背包,而后再一次用两条体积为1的鱼去尝试替代体积为2的鱼。
如果两条体积为1的鱼的美味值大于一条体积为2的鱼,那么就可以替代
直到无法替代为止
最后分别把大鱼和小鱼的答案累加即可
#include
using namespace std;
const int N = 1e5+10;
int o[N],t[N];
int leno,lent;
int n,v;
int nowo,nowt;
bool cmp(int x,int y){
return x>y;
}
int main(){
scanf("%d %d",&n,&v);
for (int i = 1; i <= n; i++){
int x,y; scanf("%d %d",&x,&y);
if (x == 1) o[++leno] = y;
else t[++lent] = y;
}
sort(o+1,o+leno+1,cmp);
sort(t+1,t+lent+1,cmp);
if (v == 1) {printf("%d",o[1]);return 0;}
if (lent*2>=v){
nowt = v/2;
if (v%2 == 1) nowo = 1;
}
else {
nowt = lent;
nowo = v-2*nowt;
}
while (nowo <= leno && nowt){
if (o[nowo+2]+o[nowo+1]>t[nowt]) nowt--,nowo+=2;
else break;
}
int ans = 0;
for (int i = 1; i <= nowo; i++) ans+=o[i];
for (int i = 1; i <= nowt; i++) ans+=t[i];
printf("%d",ans);
return 0;
}