acm刷题记录1

1.蓝桥杯2015真题

加法变乘法
我们都知道:1+2+3+ ... + 49 = 1225
现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015

比如:
1+2+3+...+10*11+12+...+27*28+ 29+...+49 = 2015
就是符合要求的答案。

请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。

注意:需要你提交的是一个整数,不要填写任何多余的内容。

//这个思路好好!

寻找数学解决方法,两式相减,遍历大大减少

#include<iostream>
using namespace std;

int main()
{
    int a,b,c,d;
    for(a=1;a<=49;a++)
    {
        b=a+1;
        for(c=2;c<50;c++)
        {
            d=c+1;
            if(b!=c)
            {
               if(a*b+c*d-a-b-c-d==790&&a!=10)
               {
                   cout<<a;
                   return 0;
               }
            }
        }
    }
}

2.[蓝桥杯2015初赛]奖券数目

有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。
虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。某抽奖活动的奖券号码是5位数(10000-9099999),要求其中不要出现带“4”的号码,主办单位请你计算一下,如果任何两张奖券不重号,最多可发出奖券多少张。

请提交该数字(一个整数),不要写任何多余的内容或说明性文字。

#include<iostream>
using namespace std;

int main()
{
	int res=0;
    for(int i=10000;i<=99999;i++)
    {
    	int cnt=0,a=i;
//啊啊啊我在这犯了个错误,我直接用i去取模判断,
//但是外面的循环是在我取模基础上加一啊!就不是原来的i了:(
    	while(a>0)
    	{
    		int x=a%10;
    		if(x==4)
    		{
    			cnt++;
    			break;//这样跳出了while,不仅仅是if
			}
			a/=10;
		}
		if(cnt==0)
			res++;
	}
	cout<<res;
	return 0;
}
//sprintf()粘贴后到前
//可以暴力,这里用个巧法

3. [蓝桥杯2015初赛]垒骰子

赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。
经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥!
我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 6。
假设有 m 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来。 
atm想计算一下有多少种不同的可能的垒骰子方式。
两种垒骰子方式相同,当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同。
由于方案数可能过多,请输出模 10^9 + 7 的结果。

4.疯狂式提交

输入一些字符串,统计它们的出现的次数

#include<iostream>
#include<map>
using namespace std;

int main()
{
	map<string,int>m;
	string s,list[4]={"AC","WA","TLE","RE"};
	while(getline(cin,s))//getline输入字符串
	{
		m[s]++;
	}
	for(auto it:list)//我试过了,用iterator不行;it/i都行
	{
		cout<<it<<" x "<<m[it]<<endl;//这个好危险,差点漏掉输出格式里的x的左右两个空格了,而且是字符串形式打“”
	}
	return 0;
}

 记一下map容器的笔记

//头文件
#include<map>或者<bits/stdc++.h>

//定义 map相当于一个映射关系
map<x的数据类型,y的>f;//f是map的名字,x是键,y是值(map讲究一对一)
//默认升序,若要降序则加一个,如下
map<string,int,greater<string> >f;//greater<x的数据类型> 表示降序

//插入
f.insert(make_pair(x,y));

//输出
for(map<string,int>::iterator it=f.begin();it!=f.end();it++)//iterator,用auto应该更好吧
	cout<<it->first<<endl;
	cout<<it->second;//first表示x,second表示y

//成员函数如下
f.size()
f.empty()
f.clear()
=f.begin();!=f.end()
insert(x),insert(make_pair(x,y))
erase(x)//删除所有等于x的元素
erase(it)//删除it指向的元素
find(x)//找x的位置,无则返回尾指针
count(x)//有返回1,无返回0
//改值
f[key]=val;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值