整理03 201312-201509

试题编号:201312-3
试题名称:最大的矩形(暴力枚举)
#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,m,h[1001],height;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>h[i];
	}
	int ans=0,min,area=0;
	for(int i=0;i<n;i++){
		min=h[i];
		for(int j=i;j<n;j++){
			if(h[j]<min){
				min=h[j];
			}
			area=(j-i+1)*min;
			if(area>ans){
				ans=area;
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}
试题编号:201312-4
试题名称:有趣的数

 DP

建立一个二维数组a[N][6],横坐标表示数位N,纵坐标表示刚才的6种状态。

这样的话:

a[ ][ 0 ]就是状态一     // 2      剩余 0 1 3

a[ ][ 1 ]就是状态二  // 2 0    剩余 1 3

a[ ][ 2 ]就是状态三  // 2 3    剩余 0 1

a[ ][ 3 ]就是状态四  // 2 0 1     剩余 3

a[ ][ 4 ]就是状态五  // 2 0 3   剩余 1

a[ ][ 5 ]就是状态六  // 2 0 1 3  剩余 无

第i位出现第j种状态的情况数表示为 a[i][j]      

i位数的来源在于(i-1)位数(已经按顺序排列)+最后一位数字
例如:

  a[i][0] = a[i-1][0] ;

      使用过2 的情况可以由:   前i-1位使用2(状态1),第i位使用2

 

  a[i][1] = (a[i-1][0] + a[i-1][1] *2);
      使用过 2 0 的情况可以由:前i-1位使用2(状态1),第i位使用0
                  前i-1位使用2 0(状态2),第i位使用0或2  (顺序正确)

     a[i][2] = (a[i-1][0] + a[i-1][2] );
          使用过 2 3 的情况可以由:前i-1位使用2(状态1),第i位使用3
                     前i-1位使用2 3(状态3),第i位使用3  (因为已经有了3了不能用2了,只能用3) 

     a[i][3] = (a[i-1][1] + a[i-1][3] *2);
         使用过 2 0 1 的情况可以由:前i-1位使用2 0(状态2),第i位使用1
                       前i-1位使用2 0 1(状态4),第i位使用1或2 (因为已经有了1了不能用0了,只能用1)

     a[i][4] = (a[i-1][1] + a[i-1][2] + a[i-1][4] *2);
         使用过 2 0 3 的情况可以由: 前i-1位使用2 0(状态2),第i位使用3
                      前i-1位使用2 3(状态3),第i位使用0
                      前i-1位使用2 0 3(状态5),第i位使用0或3 (因为已经有了3了不能用2了,只能用3)
     

     a[i][5] = (a[i-1][3] + a[i-1][4] + a[i-1][5] *2);
        使用过2 3 0 1的情况可以由: 前i-1位使用2 0 1(状态4),第i位使用3
                      前i-1位使用2 0 3(状态5),第i位使用1
                      前i-1位使用2 3 0 1(状态6),第i位使用1或3

                     (因为已经有了1了不能用0了,只能用1)

                     (因为已经有了3了不能用2了,只能用3)
    题目要求的答案为a[n][5],即0 1 2 3都使用过。

4.注意答案可能非常大,会爆int,应用long long

 

#include<bits/stdc++.h>
using namespace std;
long long n,a[1001][6];
int main(){
	cin>>n;
	memset(a,0,sizeof(a));
	a[1][0]=1;
	for(int i=2;i<=n;i++){
		a[i][0]=1;
		a[i][1]=(2*a[i-1][1]+a[i-1][0])%1000000007;
		a[i][2]=(a[i-1][2]+a[i-1][0])%1000000007;
		a[i][3]=(a[i-1][3]*2+a[i-1][1])%1000000007; 
		a[i][4]=(a[i-1][4]*2+a[i-1][2]+a[i-1][1])%1000000007;
		a[i][5]=(a[i-1][5]*2+a[i-1][4]+a[i-1][3])%1000000007;
	}
	cout<<a[n][5]<<endl;
	return 0;
} 
试题编号:201403-3
试题名称:命令行选项

用到vector<string> v;
        map<string,string> m;

#include<iostream>
#include<map>
#include<vector>
#include<string>
using namespace std;
 
int isRepeat(map<string,string> m,string s)  //判断命令是否重复 
{
	map<string,string>::iterator it;
	it = m.find(s);
	if(it == m.end())
 	{
 	    return 0;
  	}else
   	{
   	    return 1;
    }
}
 
int find(string str,char c)  //  查找命令是否存在和是否带参 
{
    int i;
    int flag = str.find(c);
	if(flag != -1)  // 该命令存在 
	{
		if(flag < str.length()-1 && str.at(flag+1) == ':')
		{
			return 2;   //  有参数 
		}else
		{
			return 1;  // 无参数 
		}
	}
    return 0;  //命令不存在 
}
int main()
{
    string str;
    int i,j,n;
    cin>>str;
    cin>>n;
    getchar();
    for(i = 0; i < n; i++)
    {
        vector<string> v;
        map<string,string> m;
        string op;
        getline(cin,op);
        string line = op;
        int t; 
        for(t = line.find(" "); t != -1; t = line.find(" "))  //将字符串以空格切割装进vector中 
        {
            v.push_back(line.substr(0,t));
            line = line.substr(t+1);
        }
        v.push_back(line);
        vector<string>::iterator it;
       
        for(it = v.begin()+1; it != v.end(); it++)
        { 
            string ss = *it;
            if(ss.at(0) == '-' && ss.length() == 2 && find(str,ss.at(1)))
            {
            	//cout<<ss<<endl;
                if(find(str,ss.at(1)) == 1) //无参数命令 
                {
                    m.insert(pair<string,string>(ss,"null"));
                }else if(find(str,ss.at(1)) == 2 && ++it != v.end()) // 有参数命令 
                {
					if(isRepeat(m,ss))   //有重复的
					{
						m[ss] = *it;   //修改key对应的值
					}else
					{
						m.insert(pair<string,string>(ss,*it));
					}   
                }else  //有参数命令(如 -w),但是后面没参数,也为不合法的命令 
				{
					break;
				}
            }else
            {
            //	cout<<ss<<endl;
                break;
            }
        }
        cout<<"Case "<<i+1<<":"; 
        map<string,string>::iterator itr;
        for(itr = m.begin(); itr != m.end(); itr++)
        {
            if(itr->second != "null")
            {
                cout<<" "<<itr->first<<" "<<itr->second;
            }else
            {
                cout<<" "<<itr->first;
            }
        }
        cout<<endl;
    }
    
    return 0;
}
试题编号:201409-3
试题名称:字符串匹配(暴力,分情况0 1)
#include<bits/stdc++.h>
#include<string>
using namespace std;
int main(){
	string s,ss[101],str;
	cin>>s;
	int n,t;
	cin>>t>>n;
	for(int i=0;i<n;i++){
		cin>>ss[i];
	}
	if(t==1){//区分大小写 
		for(int i=0;i<n;i++){
			str=ss[i];
			for(int k=0;k<=ss[i].length()-s.length() ;k++ ){
				if(str.substr(k,s.length() )==s){
					cout<<str<<endl;
					break;
				}
			}
		}
	}
	else{
		for(int i=0;s[i]!='\0' ;i++){
			if(s[i]>='A'&&s[i]<='Z'){
				s[i]+=32;//区分,全部变小写 
			}
		}
		string sss;
		for(int k=0;k<n;k++){
			string sss=ss[k];
			for(int j=0;j<ss[k].length() ;j++){
				if(ss[k][j]>='A'&&ss[k][j]<='Z'){
					ss[k][j]+=32;
				}
			}
			string f=ss[k];
			for(int j=0;j<=ss[k].length() -s.length() ;j++){
				if(f.substr(j,s.length() )==s ){
					cout<<sss<<endl;
					break;
				}
			}
		} 
	}

	return 0;
} 
试题编号:201412-3
试题名称:集合竞价

 set 放入价格 自动排序

vector 用结构体 记载 buy sell cancel 信息

//选择买家卖家成交量最小的,同时满足所有情况的最大值 
#include <iostream>
#include <vector>
#include <string>
#include <set>
using namespace std;
struct stock{
	int enable;
	string mm;
	double price;
	int num;
	stock(int a, string b, double c, int d) :enable(a), mm(b), price(c), num(d){}
};
int main(){
	vector<stock> v;
	while (1){
		string s;
		cin >> s;
        if (s == "buy" || s == "sell"){
			double p;
			int n;
			cin >> p >> n;
			stock* tem = new stock(1, s, p, n);
			v.push_back(*tem);
		}
		else if (s == "cancel"){
			int line;
			cin >> line;
			stock* tem = new stock(0, "cancel", 0, line);
			v.push_back(*tem);
			v[line - 1].enable = 0;
		}
		else
			break;
	}//输入部分结束
	set<double> Price;
	for (int i = 0; i < v.size(); i++)
		if (v[i].enable == 1&&v[i].mm=="buy")
			Price.insert(v[i].price);
	set<double>::iterator ite = Price.begin();//用一个set存储买家中的价格,此处用了set的自动排序功能,保证输出的成交价是符合条件的成交价中最高的。
	double perPrice=0;
	long long sumStock=0;//记录最小中的最大 
	while (ite != Price.end()){
		double p = *ite;
		long long sumBuy = 0;//buy的总价钱 
		long long sumSell = 0;//sell的总价钱 
		for (int i = 0; i < v.size(); i++){
			if(v[i].enable == 1){
				if (v[i].mm == "buy"&&v[i].price>=p) sumBuy += v[i].num;
				if (v[i].mm == "sell"&&v[i].price<=p) sumSell += v[i].num;
			}
		}
		long long sumBS = (sumBuy>sumSell) ? sumSell : sumBuy;
		if (sumStock <= sumBS){
			sumStock = sumBS;
			perPrice = p;
		}
		ite++;
	}
	printf("%.2f ", perPrice);
	cout << sumStock << endl;//printf("%lld\n",sumStock); 
	return 0;
}
试题编号:201503-3
试题名称:节日(暴力)
#include<bits/stdc++.h>
using namespace std;
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

int isleapyear(int year){
	if((year%4==0&&year%100!=0)||(year%400==0)){
		month[2]=29;
		return 1;
	}
	else{
		month[2]=28;
		return 0;
	} 
}
long long count(int year,int mon){
	int day=0;
	for(int i=1850;i<year;i++){
		if(isleapyear(i)){
			day+=366;
		}else{
			day+=365;
		}
	}	
	isleapyear(year);//不能少了这一句,修改月份 
	for(int i=1;i<mon;i++){
		day=day+month[i];
	}
	return day;
}
int main(){
	long long a,b,c,y1,y2;
	cin>>a>>b>>c>>y1>>y2;
	if(y1>y2){
		int t;
		t=y1;
		y1=y2;
		y2=t;
	}
	long  day=0;
	for(int i=y1;i<=y2;i++){
		day=count(i,a);
		int weekday=day%7+2;
		if(weekday==8) weekday=1;
		int monthday;
		if(c<weekday){
			monthday=(b-1)*7+8-weekday+c;
		} else{
			monthday=(b-1)*7+c-weekday+1;
		}
		isleapyear(i);
		if(monthday>month[a]){
			printf("none\n");
		}else{
			printf("%d/%02d/%02d\n",i,a,monthday);
		}	
	}
	
	return 0;
}
试题编号:201509-3
试题名称:模板生成系统
#include<bits/stdc++.h>
#include<string>
#include<vector>
#include<set> 
using namespace std;
int main(){
	vector<string>v;
	map<string,string>mp;
	int n,m;
	string str,s,sm;
	cin>>n>>m;
	getchar();
	for(int i=0;i<n;i++){
		getline(cin,str); 
		v.push_back(str); 
	}
	for(int i=0;i<m;i++){
		getline(cin,s);
		sm=s.substr(0,s.find(" ") );
		s.erase(0,sm.length() +2);
		s=s.substr(0,s.length() -1); 
		mp[sm]=s;  
	}
	
	for(int i=0;i<v.size();i++){
		int pos=-1;
		while((pos=v[i].find("{{ ",pos+1))!=string::npos ){
			int pos1=v[i].find(" }}",pos+1)+3;
			string key=v[i].substr(pos+3,pos1-pos-6);
			v[i].replace(pos,pos1-pos,mp[key]);
		}
		
	}
	for(int i=0;i<v.size();i++)
	 cout<<v[i]<<endl;
	return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值