源代码div2

目录

1.特殊的正方形

 思路

代码

 2.走楼梯2​​​​​​​

题目

样例输入

样例输出

 思路

代码

3. 走路

​​​​​​​题目

输入格式

输出格式

输入样例

输出样例

 思路

代码

4.简单分数统计​​​​​​​

题目

样例输入

样例输出

 思路

代码

5.Alice的德州扑克

​​​​​​​题目

输入格式

输出格式

 思路

代码

6.订单编号

​​​​​​​题目

输入格式

输出格式

 思路

代码

 7.饿饿 饭饭

​​​​​​​题目

输入格式

输出格式

 思路

代码

8.任务分配​​​​​​​

题目

样例输入

样例输出

 思路

代码


 

1.特殊的正方形​​​​​​​

输入n�,输出n�行n�列的由+.组成的正方形,其中最外面一圈全是+,第二圈全是.,...,对于第i�圈,如果i�是奇数,那么全是+,否则全是.

输入格式

一行,一个整数n�。

输出格式

n�行,为满足题目要求的正方形。注意不要有行末空格。

样例输入

10

样例输出

++++++++++
+........+
+.++++++.+
+.+....+.+
+.+.++.+.+
+.+.++.+.+
+.+....+.+
+.++++++.+
+........+
++++++++++

 思路

从外圈开始,一圈一圈输入字符。

代码

#include<bits/stdc++.h>
using namespace std;
int n,quan=0,num;
char a[10000][10000];
bool b[10000][10000];
void print(){
    for(int i = 1;i<=n;i++){
        for(int j = 1;j<=n;j++){
            cout<<a[i][j];
        }
        cout<<endl;
    }
}
int main(){
    cin>>n;
    num = n;
    while(quan <= n/2){
        for(int i = 1+quan;i<=num -quan;i++){
            for(int j = 1+quan;j<=num-quan;j++){
                if((i == 1+quan || i == n-quan || j == 1+quan || j == n-quan)&&b[i][j] == 0){
                    if(quan %2 != 0) a[i][j] = '.';
                    else a[i][j] = '+';
                    b[i][j] = 1;
                }
        }
   }
   quan++;
   }
    print();
    return 0;
}

 

 2.走楼梯2​​​​​​​

题目

楼梯有 n� 阶,上楼可以一步上一阶,也可以一步上二阶。

但你不能连续三步都走两阶,计算走到第n�阶共有多少种不同的走法。

输入格式

一行,一个数字,表示n�。

输出格式

输出走楼梯的方式总数。

样例输入

6

样例输出

12

 思路

动态规划,设置数组f[i][j],i代表走了i步,j代表前面有j步爬了二阶楼梯,最后依次输出f[n][i]。

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 55;
int n;
long long f[N][3];
int main() {
	cin>>n;
	f[0][0] = 1;
	for(int i = 0;i<=n;i++){
        f[i+1][0] += f[i][0] + f[i][1] + f[i][2];
        f[i+2][1] += f[i][0];
        f[i+2][2] += f[i][1];
	}
	cout<<f[n][0]+f[n][1]+f[n][2];
	return 0;
}


3. 走路

​​​​​​​题目

有一条很长的数轴,一开始你在00的位置。接下来你要走n�步,第i�步你可以往右走ai��或者bi��。

问n�步之后,00到m�的每个位置,能不能走到?

输入格式

第一行,两个整数n,m�,�。

接下来n�行,每行两个整数ai,bi��,��。

输出格式

一行,一共m+1�+1个数,每个数都是01表示能否走到,数字之间不用空格隔开。

输入样例

3 10
1 2
2 6
3 3

输出样例

00000011001

 思路

设置f[i][j]数组,i代表走了i步,j代表走到了j位置。

代码

#include<bits/stdc++.h>
using namespace std;
long long n,m,a[150],b[150];
long long f[550][100005]={0};  //走了i步后,到达了j位置
int main() {
    cin>>n>>m;
    for(int i = 0;i<n;i++){
        cin>>a[i]>>b[i];
    }
    f[0][0] = 1;
    for(int i = 0;i<n;i++){
        for(int j = 0;j<=m;j++){
            if(f[i][j] == 1 && f[i + 1][j + a[i]] <= m) f[i+1][j+a[i]] = 1;
            if(f[i][j] == 1 && f[i + 1][j + b[i]] <= m ) f[i+1][j+b[i]] = 1;
        }
    }
    for(int i = 0;i<=m;i++) cout<<f[n][i];
	return 0;
}

4.简单分数统计​​​​​​​

题目

N� 个好朋友在codeforces上参加一场包含 M� 个题目的比赛, 比赛期间codeforces网站一共有 k� 次提交。

已知每个题目的分数,

但是由于他们只能查到在比赛期间codeforces总共的提交记录(其他用户提交的其他题目记录也包含在内, 即存在不属于该场比赛的题目),

所以想请你编写一个程序算出他们每个人的分数。

输入格式

第一行三个整数 N�, M�, K� 分别表示好朋友的个数, 题目的个数, 和提交的总次数(其中0<N,M,K<=2000<�,�,�<=200)。

接下来 N� 行 第 i� 行输入为第 i� 个人的id,

接下来 M� 行 第 j� 行输入为第 j� 个题目的名称和分数,

接下来 K� 行 第 k� 行输入为第 k� 次提交的提交者id, 题目名称和结果("WA" 或 "AC", 如果"AC"代表通过这个题目, 提交者获得对应分数)。

注: 题目名称和id均为仅包含英文字母和数字的字符串, 题目分数为小于等于 1e61�6 的正整数. 每一行的多个输入之间用空格隔开。

所有输入的字符串长度 length�����ℎ 满足 0<length≤5000<�����ℎ≤500。

所有用户id和题目名称不存在重名, 用户AC了某个题之后之后不会再重复提交该题, 好朋友们只会提交属于比赛的题目。

输出格式

输出 N� 行, 第 i� 行输出第 i� 个人的名字和对应分数 (名字和分数用空格隔开)。

样例输入

2 2 4
GabrielPessoa
beza
metebronca 100
geometry 200
beza metebronca AC
ffern numbertheory AC
GabrielPessoa geometry WA
beza geometry AC

样例输出

GabrielPessoa 0
beza 300

 思路

直接模拟

代码

#include<bits/stdc++.h>
using namespace std;

struct node{
    string xname;
    int xscare;
};
struct node1{
    string pname;
    int pscare;
};
struct node2{
    string xname;
    string pname;
    string result;
};

int N,m,k;
node n[205];
node1 n1[205];
node2 n2[205];

int main() {
    cin>>N>>m>>k;
    for(int i = 0;i<N;i++) cin>>n[i].xname,n[i].xscare = 0;
    for(int i = 0;i<m;i++) cin>>n1[i].pname>>n1[i].pscare;
    for(int i = 0;i<k;i++) cin>>n2[i].xname>>n2[i].pname>>n2[i].result;

    for(int i = 0;i<k;i++){
        for(int j = 0;j<N;j++){
            if(n2[i].xname == n[j].xname && n2[i].result == "AC"){
               for(int l = 0;l<m;l++){
                if(n1[l].pname == n2[i].pname) n[j].xscare += n1[l].pscare;
               }
            }
        }
    }
    for(int i = 0;i<N;i++){
        cout<<n[i].xname<<" "<<n[i].xscare<<endl;
    }
	return 0;
}

 

5.Alice的德州扑克

​​​​​​​题目

德州扑克是目前世界上最流行的扑克游戏,全世界有众多相关的比赛,例如是 WSOP,WPT,EPT等,也让这款游戏的玩法变得层出不穷,丰富多变。 不要被简单的游戏规则而误导,复杂多变的比赛状况,让这款游戏在高水平的竞技中会变得非常复杂,这也让人们为德州扑克给出了这样一句评价 ”用一刻就能学会,但要用一生才能掌握” 。

现在我们并不在乎游戏规则是什么,因为 Alice 是一个德州扑克高手,他对于德州扑克的规则烂熟于心,不过他每次都记不得牌型的大小关系,他知道你是一个编程高手,所以他想让你帮他写一个程序:输入五张牌的大小和花色,输出这五张牌能组成的最大牌型.你能帮帮他吗?

为了降低你的编程难度,我们规定:

  1. 输入的牌都是来源于同一副扑克牌

  2. 输入的牌的点数都是非递减的

  3. 所有花色没有大小之分

下面给出各牌型,(从大到小)

  1. 皇家同花顺(ROYAL FLUSH):五张顺连的牌(点数连续单调递增),且最大的一张牌是A(Ace),并且五张牌的花色相同

  2. 同花顺(STRAIGHT FLUSH):五张顺连的牌(点数连续单调递增),不规定最大的一张牌是A(Ace),并且五张牌的花色相同

  3. 四条(FOUR OF A KIND):至少四张牌的点数相同

  4. 葫芦(FULL HOUSE):至少三张牌的点数相同,并且除此之外还有两张牌的点数相同

  5. 同花(FLUSH):五张牌的花色都相同

  6. 顺子(STRAIGHT):五张顺连的牌(点数连续单调递增),不要求五张牌的花色相同

  7. 特别注意:由于 Alice 是个谨慎的人,所以比 三条(THREE OF A KIND) (包括三条) 小的牌型 Alice 不在乎他们的大小关系,你只需要告诉 Alice 弃牌就行

输入格式

输入两行,每行五个数字,第一行的第 i� 个字符表示第 i� 张扑克的点数,

第二行的第 i� 个数字表示第 i� 张扑克花色。(保证输入的牌的点数是非递减的,且所有输入均合法)

点数和对应输入的数字:

  • 2−102−10 对应 2 - 10
  • J(Jack)�(����) 对应 11
  • Q(Queen)�(�����) 对应 12
  • K(King)�(����) 对应 13
  • A(Ace)�(���) 对应 14

花色和对应输入的数字:

  • 黑桃 (Spades) 对应 1
  • 方片 (Diamonds) 对应 2
  • 红桃 (Hearts) 对应 3
  • 梅花 (Clubs) 对应 4

输出格式

输出这五张牌能组成的最大牌型。

  • 如果最大是皇家同花顺输出 "ROYAL FLUSH"
  • 如果最大是同花顺输出 "STRAIGHT FLUSH"
  • 如果最大是四条输出 "FOUR OF A KIND"
  • 如果最大是葫芦输出 "FULL HOUSE"
  • 如果最大是同花输出 "FLUSH"
  • 如果最大是顺子输出 "STRAIGHT"
  • 如果最大的牌型小于等于三条输出"FOLD",劝 Alice 弃牌
  • 输出不包括引号

样例输入1

10 11 12 13 14
1 1 1 1 1

样例输出1

ROYAL FLUSH

样例输入2

10 11 12 13 14
1 2 1 3 4

样例输出2

STRAIGHT

样例输入3

6 6 6 7 7
1 2 3 1 3

样例输出3

FULL HOUSE

样例输入4

3 3 6 6 9
1 2 1 2 1

样例输出4

FOLD

 思路

直接模拟,设置多个函数来判断各个牌型,从最大的开始判断,如果是,直接输出并结束程序。如果不是,则继续判断下一个牌型。

代码

#include<bits/stdc++.h>
using namespace std;
struct node{
    int a,h;
};
node n[5];
bool huang(){
    bool b = 1;
    for(int i = 0;i<5;i++){
        if(n[i].h != n[0].h) b = 0;
        if(i != 0 && n[i].a - n[i-1].a != 1) b = 0;
    }
    if(n[4].a != 14) b = 0;
    return b;
}
bool tong(){
    bool b = 1;
    for(int i = 0;i<5;i++){
        if(n[i].h != n[0].h) b = 0;
        if(i != 0 && n[i].a - n[i-1].a != 1) b = 0;
    }
    return b;
}
bool four(){
    int max1 = 0,sum;
    for(int i = 0;i<5;i++){
        sum = 0;
        for(int j = 0;j<5;j++){
            if(n[i].a == n[j].a) sum++;
        }
        max1 = sum>max1? sum : max1;
    }
    if(max1 == 4) return 1;
    else return 0;
}
bool hulu(){
    set<int> s;
    for(int i = 0;i<5;i++) s.insert(n[i].a);
    if(s.size() == 2) return 1;
    else return 0;
}
bool flush(){
    bool b = 1;
    for(int i = 0;i<5;i++){
        if(n[i].h != n[0].h) b = 0;
    }
    return b;
}
bool shunzi(){
    bool b = 1;
    for(int i = 0;i<5;i++){
        if(i != 0 && n[i].a - n[i-1].a != 1) b = 0;
    }
    return b;
}

int main() {
    for(int i = 0;i<5;i++) cin>>n[i].a;
    for(int i = 0;i<5;i++) cin>>n[i].h;
    if(huang()){
        cout<<"ROYAL FLUSH";
        return 0;
    }
    else{
        if(tong()){
            cout<<"STRAIGHT FLUSH";
            return 0;
        }
        else{
            if(four()){
                cout<<"FOUR OF A KIND";
                return 0;
            }
            else{
                if(hulu()){
                    cout<<"FULL HOUSE";
                    return 0;
                }
                else{
                    if(flush()){
                        cout<<"FLUSH";
                        return 0;
                    }
                    else{
                        if(shunzi()){
                            cout<<"STRAIGHT";
                            return 0;
                        }
                        else{
                            cout<<"FOLD";
                            return 0;
                        }
                    }
                }
            }
        }
    }
}

6.订单编号

​​​​​​​题目

小缘开了一家公司,生意很好,每天都会收到很多订单,自动交易系统会自动给这些订单生成没有重复的订单编号。但是有一天,系统出现了未知的错误,导致当天的订单编号可能有重复的,这可把小缘急坏了。你可以帮助小缘按照规则给这些订单重新编号吗?

按照时间先后顺序给出 N� 个正整数作为原订单编号,你需要按照规则依次赋予这些订单新的编号,对于任意一个订单,要找到大于等于其原订单编号且未被使用过的(没有被之前的订单作为新的订单编号)的最小整数,作为它的新订单编号。

例如: 原订单编号依次为1 2 3 1,则新订单编号应该为1 2 3 4 (前3个订单的原订单编号都没有使用过,所以用其原订单编号即可,对于第四个订单,原订单编号为1,而1, 2, 3都已经被使用过,所以新订单编号为4)。

输入格式

第一行输入一个整数 N� (1≤N≤5×105)(1≤�≤5×105)。

第二行输入 N� 个数 ai�� (1≤ai≤109)(1≤��≤109) 作为原订单编号。

输出格式

输出一行,包含 N� 个整数为新的订单编号。

样例输入1

6
2 3 4 1 1 1

样例输出1

2 3 4 1 5 6

样例输入2

3
1000000000 1000000000 1000000000

样例输出2

1000000000 1000000001 1000000002

样例输入3

6
4 5 1 2 1 1

样例输出3

4 5 1 2 3 6

 思路

采用分区规划的方式,一个一个分区。

代码

#include<bits/stdc++.h>
using namespace std;

typedef pair<int, int>P;
set<P>s;
int n;
void myinsert(int l, int r){
	if (l > r)return;
	s.insert({ r,l });
}

int main(){
	cin>>n;
	s.insert({ 2e9,1 });
	for (int i = 1; i <= n; i++){
		int x;
		scanf("%d",&x);
		auto it = s.lower_bound({ x,0 });
		if (it->second <= x){
			cout<<x<<" ";
			myinsert(it->second, x - 1);
			myinsert(x + 1, it->first);
			s.erase(it);
		}
		else{
			cout<<it->second <<" ";
			myinsert(it->second + 1, it->first);
			s.erase(it);
		}
	}
	return 0;
}

 7.饿饿 饭饭

​​​​​​​题目

有n�个同学正在排队打饭,第i�个同学排在从前往后第i�个位置。但是这天食堂内只有一个食堂阿姨,为了使同学们都能尽快的吃上饭,每一个同学在打完一份饭之后就会排在队伍的末尾先吃着打到的饭,我们知道第i�个同学的饭量为ai��,也就是说第i�个同学要吃ai��份饭才能吃饱,当一位同学吃饱后,他就会立刻离开食堂,不会排在队伍的末尾。食堂阿姨想知道,在打完k份饭之后,队伍的样子是怎样的,但是食堂阿姨数学不太好,想让你帮忙想想办法。

输入格式

第一行给出两个整数n�,k�。

第二行给出n�个整数a1,a2,......an�1,�2,......��。

输出格式

如果食堂阿姨打饭数少于k,请输出"-1"。

否则按照队伍顺序输出每一个同学的编号。

样例输入1

3 3
1 2 1

样例输出1

2

样例输入2

4 10
3 3 2 1

样例输出2

-1

样例输入3

7 10
1 3 3 1 2 3 1

样例输出3

6 2 3

 思路

用queue直接模拟

代码

#include<bits/stdc++.h>
using namespace std;

struct node{
    long long id,fan;
};
long long n,k;
queue<node> q;

void print(queue<node> q){
     while(!q.empty()){
            cout<<q.front().id<<" ";
            q.pop();
        }
        cout<<endl;
}
int main(){
    cin>>n>>k;
    long long sum = 0;
    node a;
    for(int i = 1;i<=n;i++){
        cin>>a.fan;
        sum += a.fan;
        a.id  = i;
        q.push(a);
    }
    if(sum < k) cout<<"-1";
    else{
        while(k > 0){
            a.fan = q.front().fan-1;
            if(a.fan == 0) q.pop();
            else{
                a.id = q.front().id;
                 q.pop();
                 q.push(a);
            }
            k--;
        }
        print(q);
    }
	return 0;
}

8.任务分配​​​​​​​

题目

你有n�个任务,其中第i�个任务,在si��开始,ei��时刻结束,如果做这个任务,你能获得wi��的收益。

但是你在一个时刻只能做一个任务,问选择哪些任务,能让你的收益尽量大。

注意:你在上一个任务结束后马上开始下一个任务是可以的。

输入格式

第一行一个整数n�。

接下来n�行,每行三个整数si,ei,wi��,��,��。

输出格式

一个数,表示答案。

样例输入

3
1 3 100
2 4 199
3 5 100

样例输出

200

 思路

简单的动态规划。

代码

#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
int n,  f[1005],a[1005],b[1005],w[1005];
int main(){
	cin>>n;
	for(int i = 1;i<=n;++i){
        cin>>a[i]>>b[i]>>w[i];
	} 
	for(int i = 1;i<=1000;++i){
		f[i] = max(f[i],f[i-1]);
		for(int j = 1;j<=n;++j){
			if(a[j]==i){
				f[b[j]] = max(f[b[j]],f[i]+w[j]);
			}
		}
	}
	printf("%d\n",f[1000]);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Chrome插件中使用可移动的div元素,可以使用以下步骤: 1.在插件的popup.html文件中,创建一个div元素,并为其添加一个唯一的ID,以便在JavaScript中引用它。 2.在CSS中,使用“position: absolute”属性将div定位在popup窗口的任何位置。 3.在JavaScript中,使用鼠标事件(mousedown、mousemove、mouseup)来实现拖动功能。当鼠标按下时,记录当前鼠标位置和div位置,然后在鼠标移动时计算新的div位置,并更新div的样式。 以下是一个简单的示例代码,可以帮助你在Chrome插件中实现可移动的div元素: popup.html代码: ``` <!DOCTYPE html> <html> <head> <title>My Extension</title> <style> #draggable { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 200px; height: 200px; background-color: #f2f2f2; border: 2px solid #ccc; text-align: center; line-height: 200px; cursor: move; } </style> </head> <body> <div id="draggable">Drag me!</div> <script src="popup.js"></script> </body> </html> ``` popup.js代码: ``` var draggable = document.getElementById('draggable'); var isDragging = false; var mouseX = 0; var mouseY = 0; var boxX = 0; var boxY = 0; draggable.addEventListener('mousedown', function(e) { isDragging = true; mouseX = e.clientX; mouseY = e.clientY; boxX = draggable.offsetLeft; boxY = draggable.offsetTop; }); document.addEventListener('mousemove', function(e) { if (isDragging) { var deltaX = e.clientX - mouseX; var deltaY = e.clientY - mouseY; draggable.style.left = boxX + deltaX + 'px'; draggable.style.top = boxY + deltaY + 'px'; } }); document.addEventListener('mouseup', function(e) { isDragging = false; }); ``` 在以上代码中,我们使用“cursor: move”属性将鼠标指针设置为拖动指针,以便用户知道该元素可以拖动。当用户按下鼠标时,我们记录当前鼠标位置和div的位置。然后,在鼠标移动时,我们计算新的div位置,并使用样式更新div的位置。最后,在鼠标松开时,我们将“isDragging”标志设置为false,以停止拖动。 请注意,在Chrome插件中,我们需要将JavaScript代码单独放在一个popup.js文件中,并在popup.html中引用它。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值