高高兴兴过中秋,快快乐乐写作业
总结:
T1 恶心的枚举
T2 字符串处理
T3 回溯
1、P1023 税收与补贴问题
题目背景
每样商品的价格越低,其销量就会相应增大。现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),并假设相邻价位间销量的变化是线性的且在价格高于给定的最高价位后,销量以某固定数值递减。(我们假设价格及销售量都是整数)
对于某些特殊商品,不可能完全由市场去调节其价格。这时候就需要政府以税收或补贴的方式来控制。(所谓税收或补贴就是对于每个产品收取或给予生产厂家固定金额的货币)
题目描述
你是某家咨询公司的项目经理,现在你已经知道政府对某种商品的预期价格,以及在各种价位上的销售情况。要求你确定政府对此商品是应收税还是补贴的最少金额(也为整数),才能使商家在这样一种政府预期的价格上,获取相对其他价位上的最大总利润。
总利润=单位商品利润*销量
单位商品利润=单位商品价格 - 单位商品成本 (- 税金 or + 补贴)
输入输出格式
输入格式:
输入的第一行为政府对某种商品的预期价,第二行有两个整数,第一个整数为商品成本,第二个整数为以成本价销售时的销售量,以下若干行每行都有两个整数,第一个为某价位时的单价,第二个为此时的销量,以一行-1,-1表示所有已知价位及对应的销量输入完毕,输入的最后一行为一个单独的整数表示在已知的最高单价外每升高一块钱将减少的销量。
输出格式:
输出有两种情况:若在政府预期价上能得到最大总利润,则输出一个单独的整数,数的正负表示是补贴还是收税,数的大小表示补贴或收税的金额最小值。若有多解,取绝对值最小的输出。
如在政府预期价上不能得到最大总利润,则输出“NO SOLUTION”。
输入输出样例
输入样例#1:
31
28 130
30 120
31 110
-1 -1
15
输出样例#1:
4
AC代码:
#include<iostream> #define ABS(x) (x<0?-x:x) using namespace std; int a[10][2],n,ans=0x3f3f3f3f; inline int clac(int xl,int price,int k){ return (price-(**a)+k)*xl; } int main(){ ios::sync_with_stdio(false); int i,j,k,pp,dc,t,maxs,maxd; cin>>pp; while(cin>>a[n][0]>>a[n][1],a[n][0]+1||a[n][1]+1) n++; cin>>dc; for(maxs=maxd=0,k=-32;k<=9;k++){ for(i=0;i<n-1;i++){ for(j=*a[i];j<*a[i+1];j++){ if((t=clac(a[i][1]+(a[i+1][1]-a[i][1])/(*a[i+1]-*a[i])*(j-*a[i]),j,k))>=maxs) maxs=t,maxd=j; } } for(i=a[n-1][1];i>0;j++,i-=dc) if((t=clac(i,j,k))>=maxs) maxs=t,maxd=j; if(maxd==pp&&ABS(k)<ABS(ans))ans=k; } if(ans<0x3f3f3f3f) cout<<ans; else cout<<"NO SOLUTION"; return 0; }
2、P1098 字符串的展开
题目描述
在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母获数字串替代其中的减号,即,将上面两个子串分别输出为“defgh”和“45678”。在本题中,我们通过增加一些参数的设置,使字符串的展开更为灵活。具体约定如下:
(1) 遇到下面的情况需要做字符串的展开:在输入的字符串中,出现了减号“-”,减号两侧同为小写字母或同为数字,且按照ASCII码的顺序,减号右边的字符严格大于左边的字符。
(2) 参数p1:展开方式。p1=1时,对于字母子串,填充小写字母;p1=2时,对于字母子串,填充大写字母。这两种情况下数字子串的填充方式相同。p1=3时,不论是字母子串还是数字字串,都用与要填充的字母个数相同的星号“*”来填充。
(3) 参数p2:填充字符的重复个数。p2=k表示同一个字符要连续填充k个。例如,当p2=3时,子串“d-h”应扩展为“deeefffgggh”。减号两边的字符不变。
(4) 参数p3:是否改为逆序:p3=1表示维持原来顺序,p3=2表示采用逆序输出,注意这时候仍然不包括减号两端的字符。例如当p1=1、p2=2、p3=2时,子串“d-h”应扩展为“dggffeeh”。
(5) 如果减号右边的字符恰好是左边字符的后继,只删除中间的减号,例如:“d-e”应输出为“de”,“3-4”应输出为“34”。如果减号右边的字符按照ASCII码的顺序小于或等于左边字符,输出时,要保留中间的减号,例如:“d-d”应输出为“d-d”,“3-1”应输出为“3-1”。
输入输出格式
输入格式:
输入文件expand.in包括两行:
第1行为用空格隔开的3个正整数,一次表示参数p1,p2,p3。
第2行为一行字符串,仅由数字、小写字母和减号“-”组成。行首和行末均无空格。
输出格式:
输出文件expand.out只有一行,为展开后的字符串。
输入输出样例
输入样例#1:
【输入样例1】
1 2 1
abcs-w1234-9s-4zz
【输入样例2】
2 3 2
a-d-d
输出样例#1:
【输出样例1】
abcsttuuvvw1234556677889s-4zz
【输出样例2】
aCCCBBBd-d
说明
40%的数据满足:字符串长度不超过5
100%的数据满足:1<=p1<=3,1<=p2<=8,1<=p3<=2。字符串长度不超过100
NOIP 2007 提高第二题
AC代码:
#include<iostream> #include<string> #include<cctype> using namespace std; int main(){ //ios::sync_with_stdio(false);一句话RE两个点,慎用 string a; int x,y,z; cin>>x>>y>>z>>a; for(int i=1;i<a.length()-1;i++){ if(a[i]==‘-‘&&a[i-1]<a[i+1]&&a[i+1]-a[i-1]<=26&&a[i+1]!=‘-‘&&a[i-1]!=‘-‘){ string tf=""; int start=z==1?a[i-1]+1:a[i+1]-1,end=z==1?a[i+1]-1:a[i-1]+1; for(int j=start;z==1?j<=end:j>=end;z==1?j++:j--){ for(int k=1;k<=y;k++){ tf+=x==1?tolower(j):x==2?toupper(j):‘*‘; } } a.replace(i,1,tf); } } cout<<a; return 0; }
3、P1294 高手去散步
题目背景
高手最近谈恋爱了。不过是单相思。“即使是单相思,也是完整的爱情”,高手从未放弃对它的追求。今天,这个阳光明媚的早晨,太阳从西边缓缓升起。于是它找到高手,希望在晨读开始之前和高手一起在鳌头山上一起散步。高手当然不会放弃这次梦寐以求的机会,他已经准备好了一切。
题目描述
鳌头山上有n个观景点,观景点两两之间有游步道共m条。高手的那个它,不喜欢太刺激的过程,因此那些没有路的观景点高手是不会选择去的。另外,她也不喜欢去同一个观景点一次以上。而高手想让他们在一起的路程最长(观景时它不会理高手),已知高手的穿梭机可以让他们在任意一个观景点出发,也在任意一个观景点结束。
输入输出格式
输入格式:
第一行,两个用空格隔开的整数n、m. 之后m行,为每条游步道的信息:两端观景点编号、长度。
输出格式:
一个整数,表示他们最长相伴的路程。
输入输出样例
输入样例#1:
4 6
1 2 10
2 3 20
3 4 30
4 1 40
1 3 50
2 4 60
输出样例#1:
150
说明
对于100%的数据:n≤20,m≤50,保证观景点两两之间不会有多条游步道连接.
AC代码:
#include<cstdio> #include<algorithm> using namespace std; #define N 21 int n,m,d[N][N],maxn=-1; bool c[N][N],vis[N]={1}; int dfs(int x,int dis){ for(int i=1;i<=n;i++){ if(!vis[i]&&c[x][i]){ vis[i]=1; c[x][i]=c[i][x]=0; dis+=d[x][i]; maxn=max(dis,maxn); dfs(i,dis); vis[i]=0; c[x][i]=c[i][x]=1; dis-=d[x][i]; } } } int main(){ scanf("%d%d",&n,&m); for(int i=1,u,v,w;i<=m;i++){ scanf("%d%d%d",&u,&v,&w); c[u][v]=c[v][u]=1; d[u][v]=d[v][u]=w; } for(int i=1;i<=n;i++) c[0][i]=1; dfs(0,0); printf("%d",maxn); return 0; }