过了两秒钟发现if后面没写小括号的哭晕在厕所……
#include <iostream>
#include <math.h>
#include<set>
#include<map>
#include<vector>
#include<string>
using namespace std;
int main(){
int n,m,i,x,j,max1,max2,q;
long int y,z;
std::vector<int> a;
std::vector<long int> b;
while(cin>>n){
j=0;
max1=0;
max2=0;
for(i=0;i<n;i++){
cin>>x>>y;
a.push_back(x);
b.push_back(y);}
//std::vector<int>::iterator biggest1 = std::max_element(a[0],a.end());
//std::vector<long int>::iterator biggest2 = std::max_element(std::begin(b), std::end(b));
q= *max_element(a.begin(),a.end());
z=*max_element(b.begin(),b.end());
//cout<<z<<endl;
for(long int t=0;t<z+q;t++){
j=0;
for(i=0;i<n;i++){
if(a[i]-t<=0&&a[i]-t+b[i]>=0){
j=j+1;}}
if (j>=max2){
if (j>=max1){
max2=max1;
max1=j; }
else{
max2=j;}}
}
cout<<max1+max2<<endl;
}
}
//通过率80%。。。。。不知道咋回事,道友请指教 #include <iostream> #include <cmath> #include <iomanip> using namespace std; int main() { int n; cin>>n; int a[n]; for (int i=0; i<n; i++) { cin>>a[i]; } int m; if(n*3%5==0) { m=n*3/5; } else { m=n*3/5+1; } double k = 1; double z=1; double u=1; double p; double result;//存储结果 for (int i=1; i<n+1;i++) { k=k*i; } for (int i=1; i<m+1;i++) { z=z*i; } for (int i=1; i<n-m+1;i++) { u=u*i; } p=k/(z*u)+1; //cout<<p; double q=1; for (int t=0; t<n; t++) { q = a[t]*q; } double x=q/pow(100, n); result = p*x; cout<<setiosflags(ios::fixed)<<setprecision(5)<<result<<endl; //cout<<m; return 0; }
n = int(raw_input()) points = [] for i in range(n): point = raw_input().split(" ") points.append([int(point[0]),int(point[0])+int(point[1])]) # sort points by end x-axis points = sorted(points, key=lambda x: x[1]) # count items for every valid intervals res = {} end = -sys.maxint for interval in points: if interval[0] > end: res[interval[1]] = 1 end = interval[1] else: res[end] += 1 # find the largest 2 intervals max = sorted(res.values())[-2:] print(sum(max))
本地至少样例输入是能输出4的(欢迎复制粘贴跑一跑),然而测试一个都不过,求高人指点!
public class teminater
{
public static class car
{
int x1;
int x2;
boolean hit = false;
public car(int a, int b)
{
x1 = a;
x2 = b;
};
boolean hit(int boo)
{
return (x1 <= boo) && (boo <= x2);
}
};
public static int[] sort(int[] sq, int m, int n)
{
int rtag = 2;
int ltag = 2;
int pivot = sq[m];
int low = m;
int high = n;
while (high > low)
{
while ((high > low) && (sq[high]) >= pivot)
{
high--;
switch (rtag)
{
case 0:
break;
case 1:
{
if (sq[high + 1] > sq[high + 2])
{
rtag = 0;
}
break;
}
case 2:
{
rtag = 1;
break;
}
}
}
sq[low] = sq[high];
while ((high > low) && (sq[low]) <= pivot)
{
low++;
switch (ltag)
{
case 0:
break;
case 1:
{
if (sq[low - 1] < sq[low - 2])
{
ltag = 0;
}
break;
}
case 2:
{
ltag = 1;
break;
}
}
}
sq[high] = sq[low];
}
sq[high] = pivot;
int[] r = new int[3];
r[0] = high;
r[1] = ltag;
r[2] = rtag;
return r;
}
public static void qsort(int[] sq, int m, int n)
{
int[] mid =
{ 0, 0, 0 };
if (m < n)
{
mid = sort(sq, m, n);
}
if ((mid[0] - 1 > m) && (mid[1] == 0))
{
qsort(sq, m, mid[0] - 1);
}
if ((mid[0] + 1 < n) && (mid[2] == 0))
{
qsort(sq, mid[0] + 1, n);
}
}
public static void main(String[] ags)
{
Scanner s = new Scanner(System.in);
int n = s.nextInt();
s.nextLine();
int[] cands = new int[2 * n];
car[] cars = new car[n];
for (int i = 0; i < n; i++)
{
int x = s.nextInt();
int y = s.nextInt();
s.nextLine();
cands[2 * i] = x;//临界值肯定是某个矩形的边界,所以只考虑边界
cands[2 * i + 1] = x+y;
cars[i] = new car(x, x+y);
}
qsort(cands, 0, cands.length - 1);//对2*n个边界快排
int result = 0;
int tagi = Integer.MAX_VALUE;
for (int i = 0; i < cands.length; i++)//双重遍历
{
if (cands[i] == tagi)
continue;
int count1 = 0;
for (int m = 0; m < cars.length; m++)
{
if (cars[m].hit(cands[i]))
{
count1++;
cars[m].hit = true;
}
}
int tagj = Integer.MAX_VALUE;
for (int j = i + 1; j < cands.length; j++)
{
if (cands[j] == tagj)
continue;
int count2 = 0;
for (int m = 0; m < cars.length; m++)
{
if (cars[m].hit(cands[i]))
{
if (cars[m].hit == false)
//count1++;忘记把count1改成count2.没ac过
count++;
else
{
cars[m].hit = false;
}
}
}
int temp = count1 + count2;
if (result < temp)
{
result = temp;
}
tagj = cands[j];
}
tagi = cands[i];
}
System.out.println(result);
}
}
只AC了一题
警察小偷
public class Main
{
public static void main(String[] args)
{
// TODO Auto-generated method stub
Scanner s = new Scanner(System.in);
int n = s.nextInt();
s.nextLine();
String q = s.nextLine();
LinkedList<Integer> ls = new LinkedList<Integer>();
int re = -1;
int found = 0;
System.out.println(q);
for (int i = 0; i < q.length(); i++)
{
char w = q.charAt(i);
if (w == 'X')
{
if (re >= i)
{
found++;
} else
{
ls.add(i);
}
} else if (w == '#')
{
} else
{
int ab = w - '0';
while ((!ls.isEmpty()) && (ls.peekLast() + ab >=i))
{
ls.pollLast();
found++;
System.out.println("here");
}
int cre=i+ab;
if(cre>re)re=cre;
}
}
System.out.println(found);
}
}
第二题差一点点
终结者C代码,AC80%,到最后一刻都木有找到哪个case通不过。
主要思想就是将所有边界点揉碎了在一起遍历,找到所有矩形的左侧坐标到右侧坐标中均包括的最多的一个点,记录下次数,之后将于这个点相关的所有矩形去除,用同样的方式遍历第二个点。
最终返回值。
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
struct P
{
long long int begin,end;
}pa[205];
int main()
{
int n, i, j;
while (cin >> n)
{
for (i = 0; i < n; ++i)
{
int l;
cin >> pa[i].begin >> l;
pa[i].end = pa[i].begin + l;
}
int maxx = 0;
long long int x1;
for (i = 0; i < n; ++i)
{
long long int x=pa[i].begin, y=pa[i].end;
int sumx = 0, sumy = 0;
for (j = 0; j < n; ++j)
{
if (pa[j].begin <= x&&pa[j].end >= x)
++sumx;
if (pa[j].begin <= y&&pa[j].end >= y)
++sumy;
}
if (sumx>maxx)
{
x1 = x;
maxx = sumx;
}
if (sumy > maxx)
{
x1 = y;
maxx = sumy;
}
}
int ans = maxx;
for (i = 0; i < n; ++i)
{
if (pa[i].begin <= x1&&pa[i].end >= x1)
pa[i].begin = pa[i].end = -1;
}
maxx = 0;
for (i = 0; i < n; ++i)
{
long long int x = pa[i].begin, y = pa[i].end;
if (x == -1)
continue;
int sumx = 0, sumy = 0;
for (j = 0; j < n; ++j)
{
if (pa[j].begin == -1)
continue;
if (pa[j].begin <= x&&pa[j].end >= x)
sumx++;
if (pa[j].begin <= y&&pa[j].end >= y)
sumy++;
}
if (sumx>maxx)
maxx = sumx;
if (sumy > maxx)
maxx = sumy;
}
ans += maxx;
cout << ans << endl;
}
return 0;
}
异或比较简单,水过...
#include<iostream> #include<cstring> using namespace std; #define maxN 21 char a[maxN]; char b[maxN]; int res[maxN]; int main() { int n,i; while (cin >> n) { for (i = 0; i < n; ++i) cin >> a[i]; for (i = 0; i < n; ++i) cin >> b[i]; for (i = 0; i < n; ++i) res[i] = a[i] == b[i] ? 0 : 1; int num = 0; int tmp = 1; for (i = n - 1; i >= 0; --i) { if (res[i]) num += tmp; tmp *= 2; } cout << num << endl; } return 0; }
var line; var numflag = false; var pri = []; while(line = read_line()){ line = line.split(' '); if(!numflag){ var n = parseInt(line[0]); var m = parseInt(line[1]); numflag = true; } else { for(var i = 0; i < line.length; i++){ pri[i] = parseInt(line[i]); } maxBenefit(n, m, pri); pri = []; numflag = false; } } function maxBenefit(n, m, arr){ var minn = Math.min(n, m); arr.sort(function (a, b){ return b - a; }) var priMax = -1; var pri = 0; for(var i = 0; i < minn; i++){ if(arr[i] * (i+1) > priMax){ pri = arr[i]; priMax = pri * (i + 1); } } print(pri); }
为什么n=123 m=456 的时候始终会输出两个数据?
// 10 67 27 32 9 45 40 27 24 38 39 19 33 30 42 34 16 40 9 5 31 我笔算是10 ,我的代码也是10 ,为什么是9,不明白,谁能帮我解释下啊 #include<cstdio> #include<string> #include<iostream> #include<cmath> #include<vector> #include<algorithm> #include<cstring> using namespace std; class node{ public :int x; public :int y; public : node(int X,int Y) { x=X; y=X+Y; } }; bool cmp(node a,node b) { return a.x<b.x; } bool cmp2(int a,int b) { return a>b; } int main() { int n; while(scanf("%d",&n)==1) { vector<node> a; int x,y; int i=n; int j; while(i--) { cin>>x>>y; a.push_back(node(x,y)); } sort(a.begin(),a.end(),cmp); vector<int> ans; for(i=0;i<n;i++) { int t=1; //printf("%d %d %d\n ",a[i].x,a[i].y,t); for(j=i+1;j<n;j++) { if(a[j].x<=a[i].y) { t++; //printf("%d %d %d\n ",a[j].x,a[j].y,t); } else { //printf("%d %d %d\n ",a[j].x,a[j].y,t); break; } } ans.push_back(t); } int max=2; for(i=0;i<ans.size();i++) { int t=ans[i]; if(t>max) max=t; for(j=i+1;j<ans.size();j++) { if(a[j].x>a[i].y) { //printf("%d %d %d %d %d %d\n ",a[i].x,a[i].y,ans[i],a[j].x,a[j].y,ans[j]); if(t+ans[j]>max) max=t+ans[j]; } } } if(n==1) cout<<1<<endl; cout<<max<<endl; } return 0; }
//异或答案 #include <iostream> using namespace std; //计算2^(n) int get(int n) { int m=1; for(int i=n;i>0;i--) { m*=2; } return m; } int main() { int n; cin>>n; char num1[n];//存储二进制字符 char num2[n]; //存储二进制字符 char num[n]; //存储异或结果 cin>>num1; cin>>num2; for(int i=0;i<n;i++) { if(num1[i]==num2[i]) { num[i]='0'; } else num[i]='1'; } num[n]='\0'; cout<<num<<endl; int res=0;//存二进制转十进制结果 for(int i=0;i<4;i++) { res+=(num[i]-48)*get(3-i); } cout<<res<<endl; system("pause"); return 0; }
var linecount = 0; var line; var n = 0; var m = 0; var price = []; var ans = 0; var maxP = 0; while (line = read_line()) { if (linecount == 0) { var inputArray = line.split(' '); n = parseInt(inputArray[0]); m = parseInt(inputArray[1]); linecount++; } else if (linecount == 1) { price = line.split(' '); for (var i = 0; i < price.length; i++) { var num = getBuyerNum(price, parseInt(price[i])); var temp = parseInt(price[i]) * num; if (temp >= maxP) { if (temp == maxP) { if (ans > parseInt(price[i])) { maxP = temp; ans = parseInt(price[i]); } } else { maxP = temp; ans = parseInt(price[i]); } } } print(ans); linecount = 0; ans = 0; } } function getBuyerNum(array, price) { var num = 0; array.forEach(function (x) { if (parseInt(x) >= price) { num++; } }); return num; } //123 456 那个测试数据始终输出两行数据。真的不知道为啥
//异或Java
public class T {
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int s = sc.nextInt();
String one = sc.next();
char c1[] = one.toCharArray();
String two = sc.next();
char c2[] = two.toCharArray();
int c3[] = new int[s];
for (int i=0;i<s;i++){
if (c1[i]==c2[i]){
c3[i]=0;
}else{
c3[i]=1;
}
}
int sum = 0;
for (int i= 0,j=1;i<s;i++,j++){
sum += c3[i]*Math.pow(2, s-j);
}
System.out.println(sum);
}
}
//抓小偷问题 #include<iostream> #include<stdio.h> #include<stdlib.h> using namespace std; int main() { char sticks[5000]; bool tag[5000]={0}; int i,j,n; int ans,sum=0; scanf("%d",&n); scanf("%s",sticks); //输入字符串 ans=0; for(i=0;i<n;i++) { if(sticks[i]>='1'&&sticks[i]<='9') { ans=sticks[i]-48; if(i-ans<0){ for(j=0;j<=i+ans;j++){ if(sticks[j]=='X'){ tag[j]=1; } } } else{ for(j=i-ans;j<=i+ans;j++){ if(sticks[j]=='X'){ tag[j]=1; } } } } } for(i=0;i<n;i++){ if(tag[i]==1){ sum++; } } printf("%d\n",sum); return 0; }
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] start = new int[n];
int[] end = new int[n];
for (int i = 0; i < n; i++) {
start[i] = scanner.nextInt();
end[i] = start[i] + scanner.nextInt();
}
int res = 0;
for (int i = 0; i < n; i++) { // 第一炮
for (int j = i + 1; j < n; j++) { // 第二炮
res = Math.max(res, getCar(start, end, i, j));
}
}
System.out.println(res);
}
public static int getCar(int[] start, int[] end, int first, int second) {
int res = 0;
int n = start.length;
for (int i = 0; i < n; i++) { // 计算第i辆车可不可以被打到
if (canShoot(start[i], end[i], start[first]) || canShoot(start[i] ,end[i], start[second])) {
res++;
}
}
return res;
}
public static boolean canShoot(int start, int end, int cur) {
return start <= cur && cur <= end;
}
}
//警察抓小偷 好可惜当时做题时差一点愣是没做出来,今天看了下才发现少了个-48
#include<iostream>
using namespace std;
int main()
{
int n,nums=0;
bool flag=true;
char a;
cin>>n;
char *p=new char[n];
int *pnew=new int[n];
for(int i=0;i<n;i++)
{
pnew[i]=n+1;
}
for(int i=0;i<n;i++)
{
cin>>a;
p[i]=a;
int c=p[i];
}
for(int i=0;i<n;i++)
{
if(p[i]!='#'&&p[i]!='X')
{
int j;
if(i-p[i]-48>0)
{j=i-p[i]-48;}
else
{
j=0;
}
for(j;j<=i+p[i]-48;j++)
{
if(j<n)
{
if(p[j]=='X')
{
for(int ii=0;ii<nums;ii++)
{
if(j==pnew[ii])
flag=false;
}
if(flag)
{
pnew[nums]=j;
nums++;
}
flag=true;
}
}
}
}
}
cout<<nums<<endl;
return 0;
}
通过考试那题,可以用更少的空间
from __future__ import division import math def cal_prob(probs): probs = [p/100 for p in probs] prob_length = len(probs) dp = [0]*(prob_length+1) dp[0] = 1 for i in range(1, prob_length+1): for j in range(1, i+1)[::-1]: dp[j] = probs[i-1]*dp[j-1]+(1-probs[i-1])*dp[j] dp[0] = 1 - sum(dp[1:]) pass_length = int(math.ceil(prob_length*0.6)) return sum(dp[pass_length:]) if __name__ == '__main__': n = raw_input().strip() n = int(n) probs = raw_input().strip().split() probs = [int(p) for p in probs] print "%.5f"%cal_prob(probs)
#include<iostream>
using namespace std;
bool hit(int **p,int i,int t1,int t2){
return ((p[i][0]-t1<=0 &&p[i][0]+p[i][1]-t1>=0)||(p[i][0]-t2<=0 &&p[i][0]+p[i][1]-t2>=0));
}
int find(int **p,int n,int t1,int t2){
int i,num=0;
for(i=0;i<n;i++){
if (hit(p,i,t1,t2))
num+=1;
}
return num;
}
int time(int **p,int n){
int i,index=p[0][0]+p[0][1];
for(i=1;i<n;i++){
if(p[i][0]+p[i][1]>index)
index=p[i][0]+p[i][1];
}
return index;
}
int main(){
int n,i,j,t,k;
while(!cin.eof()){
cin>>n;
int **p=new int*[n];
for(i=0;i<n;i++){
p[i]=new int[2];
}
for(i=0;i<n;i++){
for(j=0;j<2;j++){
cin>>p[i][j];
}
}
t=time(p,n);
int number=0;
for(i=1;i<=t;i++){
for (j=i+1;j<=t;j++){
k=find(p,n,i,j);
if(k>number)
number=k;
}
}
cout<<k<<endl;
for(i=0;i<n;i++){
delete p[i];
}
delete [] p;
}
return 0;
}
我的想法就是hit函数用来判断第i个车是否被击中,传入的参数t1和t2分别表示第一次和第二次发射激光的时间,find函数用来求出在两次发射激光的时间时,能够击破车的数量,time函数就是记录最久的时间,就是所有车辆的尾部坐标的最大值,然后在主函数里用两个循环,就是两次击打时间的穷举,但是不知道为啥一个测试样例都不通过,还望大神答疑解惑,是不是我的想法有问题还是我的代码有误
import java.util.*; /** * Created by Melo on 2017/4/7. * 有一条很长的队伍,队伍里面一共有n个人。所有的人分为三类:警察,小偷和普通人。将队伍里面的人从前到后由1到n编号,编号为i的人与编号为j的人的距离为i与j之差的绝对值。 每一个警察有一个能力值x,表示他能够监视与他距离不超过x的所有人,小偷被警察发现当且仅当他被一个或多个警察监视到。你知道在整条队伍中,一共有多少个小偷会被警察发现吗? */ public class Main { public static void main(String[] args){ Scanner sc=new Scanner(System.in); int num=sc.nextInt(); sc.nextLine(); String l=sc.nextLine(); char[] line=l.toCharArray(); Set<Integer> set=new HashSet<Integer>();//存储警察的位置 for(int i=0;i<line.length;i++){ if (line[i]>='1'&&line[i]<='9') set.add(i); } int result=0; //存储结果 Iterator it=set.iterator(); while(it.hasNext()){ int locale=(int)it.next();//取出警察的位置 int power=Integer.parseInt(line[locale]+"");//得到警察的能力值 for(int i=1;i<=power;i++){ if ((locale-i)>=0){//没超左界限 if (line[locale-i]=='X'||line[locale-i]=='x'){ result++; line[locale-i]='#'; } }else break;//否则终止循环 } for(int i=1;i<=power;i++){ if ((locale+i)<=num-1){//没超右界限 if (line[locale+i]=='X'||line[locale+i]=='x'){ result++; line[locale+i]='#'; } }else break;//否则终止循环 } } System.out.println(result); } }