试题编号: | 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;
}