hdu6374 度度熊拼三角
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 284 Accepted Submission(s): 230
Problem Description
度度熊有 N 根木棒,每根木棒的长度为ai。
现在要挑选其中的三根,问能拼出的三角形的最大周长是多少。
如果不能拼成任何一个三角形,输出 −1。
Input
多组数据(不超过10组),读到EOF结束。
对于每一组数据:
第一行一个数 N 表示木棒数量。
第二行一共 N 个数,描述每一根木棒的长度。
1≤N≤1000
木棒长度都是不超过100000的正整数
Output
对于每一组数据,输出一个数表示答案。
Sample Input
3
1 1 100
7
1 9 9 90 2 2 4
Sample Output
-1
22
Source
思路:水题
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int k[100005];
int main()
{
int n;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",&k[i]);
}
sort(k,k+n);
int flag=0;
for(int i=n-1;i>=0;i--){
if(k[i]<k[i-1]+k[i-2]&&flag==0){
flag=1;
printf("%d\n",k[i]+k[i-1]+k[i-2]);
}
}
if(!flag) printf("-1\n");
}
}
hdu6375 度度熊学队列
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 1615 Accepted Submission(s): 551 Problem Description 度度熊正在学习双端队列,他对其翻转和合并产生了很大的兴趣。
Input 有多组数据。
Output 对于每组数据的每一个操作②,输出一行表示答案。
Sample Input 2 10 1 1 1 23 1 1 0 233 2 1 1 1 2 1 2333 1 2 1 23333 3 1 2 1 2 2 0 2 1 1 2 1 0 2 1 1
Sample Output 23 -1 2333 233 23333 提示 由于读入过大,C/C++ 选手建议使用读入优化。 一个简单的例子: void read(int &x){ char ch = getchar();x = 0; for (; ch < '0' || ch > '9'; ch = getchar()); for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0'; }
Source |
思路:用list,我用的vector,超时了TAT
tle代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<string.h>
using namespace std;
vector<int>vi[150000];
int a,u,v,w,val;
void read(int &x){
char ch = getchar();x = 0;
for (; ch < '0' || ch > '9'; ch = getchar());
for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
}
void func1()
{
if(w){
vi[u].insert(vi[u].end(),val);
}
else{
vi[u].insert(vi[u].begin(),val);
}
}
void func2()//
{
int f=vi[u].size();
if(vi[u].empty()) printf("-1\n");//把size改为empty依旧t了
else{
if(w){
printf("%d\n",vi[u][f-1]);
vi[u].erase(vi[u].end()-1);
}
else{
printf("%d\n",vi[u][0]);
vi[u].erase(vi[u].begin());
}
}
}
void func3()
{
int size=vi[v].size();
if(w){
for(int i=size-1;i>=0;i--){
vi[u].push_back(vi[v][i]);
}
}
else{
for(int i=0;i<size;i++){
vi[u].push_back(vi[v][i]);
}
}
vi[v].clear();
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
while(m--){
scanf("%d",&a);
if(a==1){
read(u),read(w),read(val);
func1();
}
else if(a==2){
read(u),read(w);
func2();
}
else{
read(u),read(v),read(w);
func3();
}
}
//memset(vi,0,sizeof(vi));
}
}
ac代码:
#include<cstdio>
#include<list>
#include<iostream>
using namespace std;
const int maxn = 150000+20;
list<int> lists[maxn];
void read(int &x)
{
char ch = getchar();
x = 0;
for (; ch < '0' || ch > '9'; ch = getchar());
for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
}
int main()
{
int n,q;
while(~scanf("%d%d",&n,&q))
{
for(int i=1;i<=n;i++) lists[i].clear();
while(q--)
{
int a,b,c,d;
read(a),read(b),read(c);
if(a==1){
read(d);
if(c==0) lists[b].push_front(d);
else lists[b].push_back(d);
}
else if(a==2){
if(lists[b].empty()) puts("-1");
else{
if(c==0)
{
printf("%d\n",lists[b].front());
lists[b].pop_front();
}
else{
printf("%d\n",lists[b].back());
lists[b].pop_back();
}
}
}
else{
read(d);
if(d==0) lists[b].splice(lists[b].end(), lists[c]);
else{
lists[c].reverse();
lists[b].splice(lists[b].end(), lists[c]);
}
}
}
}
return 0;
}