对于03场新生赛题的某些题目的一些独特看法
问题 E: 排座位II
为了迎接“五一”国际劳动节,笑笑所在学校决定举行庆祝活动,活动在报告厅举行,每位学生都分到了1个座位号,而报告厅的座位是按座位号蛇形排列的,学生必须对号入座。如下图是报告厅4行*5列的座位排列情况。
现在存在的一个问题是,如何让学生根据自己的座位号很快的知道自己所坐的位置(也就是座位号所在的行、列)
输入
第一行:包括两个数,r和c(1<=r,c<=100),表示报告厅座位共有r行c列。第二行:一个整数n(1<=n<=r*c),代表有n个学生想知道自己的具体位置。
接下来n行:每一行一个整数,代表询问具体位置的座位号。
输出
输出n行,每一行两个整数,代表询问的座位号所在的行和列。样例输入 Copy
4 5
3
4
13
19
样例输出 Copy
1 4
3 3
4 2
对于这一题,我们首先观察数据,发现最多100行100列,而询问的次数n最多等于100*100
正常思维:我们可以把这个二维数组进行初始化赋值,先构建出来
-
- 对于每个循环,每次都进入二维数组中查找(最low的方法)
- 观察到最后要输出的是对于每一个学号的人的位置,那么这个时候引入位置的概念,将每一个学号对应两个位置,一个横坐标,一个纵坐标
那么很简单就能联想到结构体 ,可以用两个对应关系的结构体分别存储横纵坐标
这里我用数据流做法
数据流,使用需要加上头文件<sstream>
stringstream S;
ll x=10;
string a="world";
char c='t';
S<<x;
cout<<S.str();//此时数据流会将任意形式的变量内容转为字符串并存储在数据流中,所以此时输出为10
S<<a;
cout<<S.str();//此时输出为10world
S<<c;
cout<<S.str();//此时输出为10worldt
S.str("");//清空数据流
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <iomanip>
#include <map>
#include <cstring>
#include <sstream>
using namespace std;
typedef long long ll;
typedef double dou;
const ll N=1e6+10,M=1e4+10;
ll f[100][M],n,m,st[N],num,d,k=0,maxx=-0x3f3f3f3f,minn=0x3f3f3f3f,p,ans=0,ans1,V;
string u;
vector<ll>A,B;
map<ll,ll>v;
ll sum=0,x,y,z,t;
ll a,b,c,aa,bb,cc,aaa,bbb,ccc,e,ee;
struct ZCX
{
string x,y;//定义横纵坐标
}s[N];
int main()
{
stringstream S;
cin>>n>>m;
for(ll i=1;i<=n;i++)
{
if(i%2==1)//奇数行升序
{
for(ll j=1;j<=m;j++)
{
ans++;
S<<i;//将横坐标放入数据流
s[ans].x=S.str();//赋值给横坐标
S.str("");//清空
S<<j;//将纵坐标放入数据流
s[ans].y=S.str();//赋值给纵坐标
S.str("");//清空
}
}
else//偶数行逆序
{
for(ll j=m;j>=1;j--)
{
ans++;
S<<i;
s[ans].x=S.str();
S.str("");
S<<j;
s[ans].y=S.str();
S.str("");
}
}
}
cin>>x;
while(x--)
{
scanf("%lld",&a);
cout<<s[a].x<<" "<<s[a].y<<endl; //对应输出坐标即可
}
}
问题 L: 扑克牌游戏
扑克牌有 13 种代表不同点数的牌(不考虑花色),如下图所示,从左到右依次为“A”, “2”,“3”,“4”,…… ,“10”,“J”,“Q”,“K”。
小华正在玩一个扑克牌的游戏,在这个游戏中,每种点数的牌都有一个分数(不一定 跟点数相同)。现在小华手上已经有 n 张扑克牌,他还可以挑选 m 张扑克牌,使得 n+m 张 扑克牌的总分数最大。我们假定每种点数的扑克牌有无穷多张。
请编程计算小华在游戏中可以最多获得多少分?
输入
输入共 3 行。第 1 行 13 个整数,依次表示每种点数的牌所代表的分数。
第 2 行两个整数 n 和 m,表示小华已经有 n 张扑克牌,还可以挑选 m 张扑克牌。
第 3 行输入表示小华手上已经有的 n 张扑克牌的情况,输入的两张扑克牌信息之间没有 空格分隔。
输出
输出共1行。 输出一个整数,表示小华在游戏中可以获得的最大分数。注意:小华选牌的方案可能不唯一,但只要总分数最大即可,不需要输出选牌的方案。样例输入 Copy
1 3 1 1 1 1 2 3 4 1 3 0 1
3 2
234
样例输出 Copy
13
提示
小华原来手上有 3 张牌,分别为“2”,“3”,“4”,对应的分数之和为 3+1+1=5,他可以 再挑选 2 张扑克牌,都是点数为“9”的扑克牌,这 2 张牌的分数之和为 4+4=8,所以小华的总得分为 13 分。50%的测试点输入数据保证小华手上已经有的牌中不会出现“A”、“10”、“J”、“Q”、“K” 这 5 种点数的牌。
80%的测试点输入数据保证小华手上已经有的牌中不会出现“10”这种点数的牌。
100%的测试点输入数据保证 1≤n≤100,0≤m≤100,0≤每种点数的牌所代表的分数≤1000。 这道题来简单分析,他第一行输入13个数字,代表13张牌的分数 第二行输入两个数,一个是他手上有的牌,一个是他可以再挑几张牌 第三行输入他的牌的情况,且输入不能有空格,那么很容易想到用字符串输入或者用字符数组来输入
注意点
我们可以对于13个数字,把每张牌对应的分数进行初始化,需要注意的是他的牌的号不是简单的1到13,而是A,然后2到10,最后JQK
那么这里可以用map<string,int>类型的容器来存储,至于为什么是string而不是char,那是因为10占两个位置,为了统一,干脆用字符串
最后需要注意的是输入自己有的牌的情况的时候,我采用字符串的输入形式,无论是字符串还是字符数组都可以
但是遍历的时候,取出来的单独数据都是字符类型,那么和map<string,int>对应不上,那么就需要用到数据流,将类型转为字符串
还需要注意一点,那就是如果出现了10这种占两个字符位置的牌,那么遍历的时候需要注意,他比较特殊,当判断到某个位置的下一位是0的时候,就可以说明当前位置加上后一个位置就是10这张牌
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <iomanip>
#include <map>
#include <cstring>
#include <sstream>
using namespace std;
typedef long long ll;
typedef double dou;
const ll N=1e6+10,M=1e3+10;
ll f[M][M],n,m,st[N],num,d,k=0,maxx=-0x3f3f3f3f,minn=0x3f3f3f3f,p,ans=0,ans1,V;
string u;
vector<ll>A,B;
map<string,ll>v;
ll sum=0,x,y,z,t;
string s;
ll a,b,c,aa,bb,cc,aaa,bbb,ccc,e,ee;
int main()
{
stringstream S;//定义数据流
for(ll i=1;i<=13;i++)
{
cin>>x;//整数
maxx=max(maxx,x);//先找出13个数据中的最大值,这一步就是为了当还可以自己挑选牌的时候,为了最大,那么全部选分最高的即可
if(i==1)//第一张牌是A
{
v["A"]=x;
}
if(i>=2&&i<=10)//2到10的时候,牌的号就是2到10
{
S<<i;//将序号放入数据流
v[S.str()]=x;//对应数据流的牌号赋值x
S.str("");//清空数据流,方便下一张牌的存储
}
if(i==11)//最后三张,特殊处理
{
v["J"]=x;
}
if(i==12)
{
v["Q"]=x;
}
if(i==13)
{
v["K"]=x;
}
}
cin>>n>>m;
cin>>s;//输入字符串
for(ll i=0;i<s.size();i++)
{
if(s[i+1]!='0')//下一个位置不是0
{
S<<s[i];//放入数据流,变成字符串类型
sum+=v[S.str()];//加上这张牌对应的分数
S.str("");//清空数据流
}
else//如果发现下一个位置是0
{
sum+=v["10"];//直接加上10
i++;//跳过下一个回合
}
}
sum+=m*maxx;//最后不要忘了加上还可以挑选的m张牌,为了分数最大,那么就选m张分最高的即可
cout<<sum<<endl;
}
总结
数据流的使用很多情况下可以将一些看似只能按照固定类型的变量来完成的题目,变得更加灵活,配合上数据流的使用,很多题目结合上STL,就可以创造很多种解法!
标签:03,13,10,ll,扑克牌,训练赛,2023,include,输入 From: https://www.cnblogs.com/Final-Fantasy/p/17030389.html