P1023 税收与补贴问题
题目背景
每样商品的价格越低,其销量就会相应增大。现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),并假设相邻价位间销量的变化是线性的且在价格高于给定的最高价位后,销量以某固定数值递减。(我们假设价格及销售量都是整数)
对于某些特殊商品,不可能完全由市场去调节其价格。这时候就需要政府以税收或补贴的方式来控制。(所谓税收或补贴就是对于每个产品收取或给予生产厂家固定金额的货币)
题目描述
你是某家咨询公司的项目经理,现在你已经知道政府对某种商品的预期价格,以及在各种价位上的销售情况。要求你确定政府对此商品是应收税还是补贴的最少金额(也为整数),才能使商家在这样一种政府预期的价格上,获取相对其他价位上的最大总利润。
总利润=单位商品利润 \times× 销量
单位商品利润=单位商品价格 - 单位商品成本 (- 税金 or + 补贴)
输入输出格式
输入格式:
输入的第一行为政府对某种商品的预期价,第二行有两个整数,第一个整数为商品成本,第二个整数为以成本价销售时的销售量,以下若干行每行都有两个整数,第一个为某价位时的单价,第二个为此时的销量,以一行 -1−1 , -1−1 表示所有已知价位及对应的销量输入完毕,输入的最后一行为一个单独的整数表示在已知的最高单价外每升高一块钱将减少的销量。
输出格式:
输出有两种情况:若在政府预期价上能得到最大总利润,则输出一个单独的整数,数的正负表示是补贴还是收税,数的大小表示补贴或收税的金额最小值。若有多解,取绝对值最小的输出。
如在政府预期价上不能得到最大总利润,则输出“NO SOLUTION”。
输入输出样例
说明
所有数字均小于100000
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 using namespace std; 5 struct hh 6 { 7 int price,sale; 8 } 9 G[10001]; 10 int main() 11 { 12 int n,m; 13 scanf("%d",&n); 14 int p=1; 15 int chengben,ssale; 16 int g=0; 17 scanf("%d %d",&chengben,&ssale); 18 while(scanf("%d %d",&G[p].price,&G[p].sale)&&G[p].price!=-1) 19 { 20 if(G[p].price==n) 21 g=p,p++; 22 else 23 p++; 24 } 25 p--; 26 scanf("%d",&m); 27 int f=p; 28 f++; 29 if(G[p].price>n&&!g) 30 { 31 int e=0; 32 for(int i=1;i<=p;i++) 33 { 34 if(G[i].price<n) 35 { 36 G[p].price=G[i].price; 37 G[p].sale=G[i].sale; 38 e++; 39 } 40 } 41 if(!e) 42 { 43 G[p].price=chengben; 44 G[p].sale=ssale; 45 } 46 } 47 for(int i=G[p].price+1;i<=10001;i++) 48 { 49 G[f].price=i; 50 G[f].sale=G[p].sale-(m*(G[f].price-G[p].price)); 51 f++; 52 } 53 if(g==0) 54 { 55 for(int i=p;i<=10001;i++) 56 { 57 if(G[i].price==n) 58 { 59 g=i; 60 break; 61 } 62 } 63 } 64 int h=0; 65 for(int i=1;i<=10001;i++)//补贴 66 { 67 int a=(G[g].price-chengben+i)*G[g].sale; 68 int b=(G[g-1].price-chengben+i)*G[g-1].sale; 69 int c=(G[g+1].price-chengben+i)*G[g+1].sale; 70 if(a>b&&a>c) 71 { 72 printf("%d",i); 73 h++; 74 return 0; 75 } 76 } 77 if(h==0) 78 { 79 for(int i=1;i<=10001;i++) 80 { 81 int a=(G[g].price-chengben-i)*G[g].sale; 82 int b=(G[g-1].price-chengben-i)*G[g-1].sale; 83 int c=(G[g+1].price-chengben-i)*G[g+1].sale; 84 if(a>=b&&a>=c) 85 { 86 printf("-%d",i); 87 h++; 88 return 0; 89 } 90 } 91 } 92 if(h==0) 93 printf("NO SOLUTION"); 94 return 0; 95 }
P1031 均分纸牌
题目描述
有 NN 堆纸牌,编号分别为 1,2,…,N1,2,…,N 。每堆上有若干张,但纸牌总数必为 NN 的倍数。可以在任一堆上取若干张纸牌,然后移动。
移牌规则为:在编号为 11 堆上取的纸牌,只能移到编号为 22 的堆上;在编号为 NN 的堆上取的纸牌,只能移到编号为 N-1N−1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。
现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。
例如 N=4N=4 , 44 堆纸牌数分别为:
① 99 ② 88 ③ 1717 ④ 66
移动 33 次可达到目的:
从 ③ 取 44 张牌放到 ④ ( 9,8,13,109,8,13,10 )-> 从 ③ 取 33 张牌放到 ②( 9,11,10,109,11,10,10 )-> 从 ② 取 11 张牌放到①( 10,10,10,1010,10,10,10 )。
输入输出格式
输入格式:
两行
第一行为: NN ( NN 堆纸牌, 1 \le N \le 1001≤N≤100 )
第二行为: A_1,A_2, … ,A_nA1,A2,…,An ( NN 堆纸牌,每堆纸牌初始数, l \le A_i \le 10000l≤Ai≤10000 )
输出格式:
一行:即所有堆均达到相等时的最少移动次数。
输入输出样例
4 9 8 17 6
3
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,a[105]; 4 int main(){ 5 6 scanf("%d",&n); 7 int sum=0; 8 for(int i=0;i<n;i++){ 9 scanf("%d",&a[i]); 10 sum+=a[i]; 11 } 12 sum/=n; 13 int k=0; 14 for(int i=0;i<n;i++){ 15 a[i]-=sum; 16 if(a[i]!=0) a[i+1]+=a[i],k++; 17 } 18 printf("%d\n",k); 19 }
P1042 乒乓球
题目背景
国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中 1111 分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白 1111 分制和 2121 分制对选手的不同影响。在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。
题目描述
华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在 1111 分制和 2121 分制下,双方的比赛结果(截至记录末尾)。
比如现在有这么一份记录,(其中W
表示华华获得一分,L
表示华华对手获得一分):
WWWWWWWWWWWWWWWWWWWWWWLW
在 1111 分制下,此时比赛的结果是华华第一局 1111 比 00 获胜,第二局 1111 比 00 获胜,正在进行第三局,当前比分 11 比11 。而在 2121 分制下,此时比赛结果是华华第一局 2121 比 00 获胜,正在进行第二局,比分 22 比 11 。如果一局比赛刚开始,则此时比分为 00 比 00 。直到分差大于或者等于 22 ,才一局结束。
你的程序就是要对于一系列比赛信息的输入( WLWL 形式),输出正确的结果。
输入输出格式
输入格式:
每个输入文件包含若干行字符串,字符串有大写的 WW 、 LL 和 EE 组成。其中 EE 表示比赛信息结束,程序应该忽略E之后的所有内容。
输出格式:
输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。其中第一部分是 1111 分制下的结果,第二部分是 2121 分制下的结果,两部分之间由一个空行分隔。
输入输出样例
说明
每行至多25个字母,最多有2500行
1 #include<cstdio> 2 using namespace std; 3 int f21[10000][2]; 4 int main() 5 { 6 int w1=0,l1=0,w2=0,l2=0,j=0; 7 char k; 8 while(scanf("%c",&k)&&k!='E') 9 { 10 if(k=='W'){w1++;w2++;} 11 if(k=='L'){l1++;l2++;} 12 if((w1>=11&&w1-l1>=2)||(l1>=11&&l1-w1>=2)){printf("%d:%d\n",w1,l1);w1=0;l1=0;}; 13 if((w2>=21&&w2-l2>=2)||(l2>=21&&l2-w2>=2)){f21[j][0]=w2;f21[j][1]=l2;w2=0;l2=0;j++;}; 14 } 15 printf("%d:%d\n\n",w1,l1); 16 for(int i=0;i<j;i++)printf("%d:%d\n",f21[i][0],f21[i][1]); 17 printf("%d:%d",w2,l2); 18 }