POJ 3617 贪心

题目链接:http://poj.org/problem?id=3617

大致题意:给定一个字符串s,通过这个字符串来构造一个新的字符串t,从s的头部或者尾部删除一个小的字符加入t的尾部。

分析,我们很容易想到,直接判断头尾大小即可。可是,这样的话,如果头尾相等的话,那么对于哪一个先删去还是无法确定。这个时候我们就需要比较相等字符的前一个字符,如果还相等,那么继续比较。。知道找到那个不等的字符,找到即跳出循环。

这段代码很精细。却不是我写的。

代码如下:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 using namespace  std;
 5
 6 int main()
 7 {
 8     char s[2005];
 9     int n,i,j,k;
10     scanf("%d",&n);
11     for(i=0;i<n;i++)
12     {
13         char ch;
14         cin>>ch;
15         s[i]=ch;
16     }//注意输入的时候用cin比较方便,因为是单个字符输入,如果用sacnf的话,换行什么的用getchar来吸收也是有效的,可是程序一直报错。。。。= =||
17     int num=0;
18     int a=0,b=n-1;//设置头尾两个地址。。
19     while (a<=b)
20     {
21         bool l=false;//用l标记删除头字符还是尾字符。
22         for(i=0;a+i<=b;i++)//如果s[a+i]==s[b-i]  依次循环,找到不等的那一个字符,跳出循环。这就是这个算法的精辟之处。
23         {
24             if(s[a+i]<s[b-i])//如果找到的不等的那个字符是前面小于后面的。。则删除前面的。。先把s[a]输出,然后再把地址a++
25             {
26                 l=true;
27                 break;
28             }else if(s[a+i]>s[b-i])//如果不等的那个字符是后面小于前面,则删除后面的,先把s[b]输出,再把地址b--;
29             {
30                 l=false;
31                 break;
32             }//如果s[a+0]==s[b-0],即无法判断出,则直接i++,那么继续判断s[a+1]与s[b-1]大小,循环往复,知道找到不等的情况。
33         }
34         if(l)
35             printf("%c",s[a++]);//先输出s[a],后a++
36         else
37             printf("%c",s[b--]);//先输出s[b],后b--;
38         num++;
39         if(num%80==0)//题目还有一个细节处理,输出的字符每一行不得超过80个字符。意味着当字符个数num是80的倍数时,换行依次。
40             printf("\n");
41     }
42     printf("\n");
43     return 0;
44 }

贪心就是找到一个子问题的最优解,然后扩展到全局,进而找到全局最优解。多练多想

时间: 2024-10-16 15:04:56

POJ 3617 贪心的相关文章

poj 3617 Best Cow Line (字符串反转贪心算法)

Best Cow Line Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9284   Accepted: 2826 Description FJ is about to take his N (1 ≤ N ≤ 2,000) cows to the annual"Farmer of the Year" competition. In this contest every farmer arranges his

poj 3617

/* poj 3617 best cow line 题意为给定长度为N的字符串S,需要构造出长度为N的字符串T,开始的时候T是一个空串 随后只能反复从S的开始或者结尾的地方取一个字符接到T的末尾,要求是根据这个规则 构造出字典序尽可能小的字符串T 算法设计:每次都比较末尾和开头的字符,如果不想等,则选择字典序较小的那个字符 接到T的末尾,这样构造出来的字符串T就是那个字典序最小的T */ #include<iostream> #include<cstdio> #define max

POJ 2231 贪心吗?怎么感觉像是数学。。。。

过了两次用了两种不同方法,其实也差不多,如果真的暴力去求得话铁定超时,(好像优化减去一些不可能的情况也能过,但是我没尝试)所以找一下规律咯,没学过算法的渣只能靠思维做题了... #include<stdio.h> int a[10009]; int main() { int n,m,t,i,j; long long sum; while(scanf("%d",&n)!=EOF) { sum=0; for(i=1;i<=n;i++) scanf("%d

poj 1017(贪心)

[题目大意] 题目大意是这样的:某工厂生产几种产品,首先用packet包住,这些产品的高度都是h,底面积有1*1,2*2,3*3,4*4,5*5,6*6六种规格,下面我们要用高度为h,底面积为6*6的集装箱装这些货物,问怎样使所用集装箱数目最少? [解题思路] 我们首先必须先装底面积大的货物,并且对于面积为4*4,5*5,6*6的货物,每一件都需要一个独立的集装箱.对于底面积为3*3的货物,每四个需要一个集装箱. 那么我们可以得知对于装了底面积为3*3的货物的集装箱,其剩余可以装5,3,1个底面

POJ 3617 Best Cow Line (贪心)

题意: 给定长度为N的字符串S,要构造一个长度为N的字符串T.起初T是一个空串,随后反复进行下列任意操作 1.从字符串S头部删除一个字符,加到T的尾部 2.从字符串S尾部删除一个字符,加到T的尾部 目的是,构造字典序尽可能小的字符串T 思路:简单贪心,比较当前字符串S首尾字符的大小,选取小的加入T,若两者相同,则比较下一个字符. #include<stdio.h> #include<queue> #include<iostream> #include<algori

POJ 3617 Best Cow Line (贪心)

Best Cow Line Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11230   Accepted: 3329 Description FJ is about to take his N (1 ≤ N ≤ 2,000) cows to the annual"Farmer of the Year" competition. In this contest every farmer arranges his

贪心/POJ 3617 Best Cow Line

1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int main() 5 { 6 int n; 7 char s1[2020],s2[2020]; 8 scanf("%d",&n); 9 for (int i=0;i<n;i++) 10 { 11 char ch; 12 scanf(" %c",&ch); 13 s1[i]=ch; 14 }

poj 3617 Best Cow Line(贪心)

 Best Cow Line Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8579   Accepted: 2629 Description FJ is about to take his N (1 ≤ N ≤ 2,000) cows to the annual"Farmer of the Year" competition. In this contest every farmer arranges h

POJ 3617 - Best Cow Line(字典序最小) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=3617 洛谷题目链接:https://www.luogu.org/problem/show?pid=2870 题目大意: 给定一个长度为N(1<=N<=30000)的字母序列,每次可以从序列头部或尾部取出一个字母加入一个队列的尾部,求此队列字典序最小的排列. 每输出80个字母,换行一次. 分析: 每次比较序列首部和尾部,取出较小的一个,如果相等就继续往下比较,直