#include<bits/stdc++.h>
using namespace std;
int main() {
long long a, b;
while (cin >> a >> b)
cout << a + b << endl;
}
#include<bits/stdc++.h>
using namespace std;
int b[100010];
int main() {
int a;
while (scanf("%d", &a) == 1 ){
int max = 0;
memset(b,0,sizeof(b));
for (int i = 0; i < a; i++) {
scanf("%d", &b[i]);
}
for (int i = 0; i < a; i++) {
if (b[i] >= max) {
max = b[i];
}
}
printf("%d\n", max);
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main(){
char a;
a = '*';
int n;
while( cin >> n ){
for( int i = 0 ; i < n ; i++ ){
bool flag = true;
for( int j = 1 ; j <= n + i ; j++ ){
if( j > n - 1 - i )
cout<<a;
else
cout<<" ";
}
cout<<endl;
}
}
return 0;
}
#include<bits/stdc++.h>
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
int i,j,i1,j1,maxm=0,sum;
int s[50][50];
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&s[i][j]);
}
}
for(i=0;i<n-k+1;i++)
{
for(j=0;j<n-k+1;j++)
{
sum=0;
for(i1=0;i1<k;i1++)
{
for(j1=0;j1<k;j1++)
{
sum=sum+s[i+i1][j+j1];
}
}
if(maxm<sum)
{
maxm=sum;
}
}
}
printf("%d\n",maxm);
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
static const int maxn = 1e6 + 10;
static int t, a, b;
static int h[10] = { 1, 0, 0, 0, 1, 0, 1, 0, 2, 1 };
static int p[maxn];
int cycleOfnum(int x)
{
int cnt = 0;
do
{
cnt += h[x % 10];
x /= 10;
} while (x);
return cnt;
}
void process()
{
p[0] = 0;
for (int i = 1; i <= 1e6; i++)
{
p[i] = cycleOfnum(i) + p[i - 1];
}
}
int main()
{
process();
cin >> t;
while (t--){
cin >> a >> b;
cout << p[b] - p[a - 1] << endl;
}
return 0;
}
最大值只可能在相邻两个数的相减过程中产生,这是为什么啊,我觉得分分钟就有反例啊,很迷很迷
#include<bits/stdc++.h>
typedef long long LL;
int main()
{
LL i,d=0,t,f,n=0;
LL a,b,c,m;
LL arr[200001];
while(scanf("%lld",&t)!=EOF)
{
for(int i=0;i<t;i++)
scanf("%lld",&arr[i]);
LL Min=arr[1]-arr[0];
for(i=1; i<t-1; i++)
{
if(arr[i+1]-arr[i]>Min)
Min=arr[i+1]-arr[i];
}
printf("%.2f\n",(double)Min);
}
return 0;
}
经典搜索题目
#include<bits/stdc++.h>
int n,m;
char a[600][600];
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int dfs(int x,int y)
{
int xx,yy,d=0,i;
int flag=0;
if(a[x][y]=='E')
return 1;
for(i=0;i<4;i++)
{
xx=x+dx[i];
yy=y+dy[i];
if(a[xx][yy]!='#'&&xx>=0&&yy>=0&&x<n&&y<m)
{
a[x][y]='#';
d=dfs(xx,yy);
if(d)
return 1;
else
continue;
}
}
return 0;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(a,'\0',sizeof(a));
int i;
for(i=0;i<n;i++)
scanf("%s",a[i]);
int d;
d=dfs(0,0);
if(d)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
真就计算所有情况的和就可以了呗......
#include<bits/stdc++.h>
int main()
{
int n,m,p,q,i;
long long a;
while(scanf("%d",&n)!=EOF)
{
a=1;
for(i=0;i<n;i++)
{
scanf("%d%d",&p,&q);
m=q+p;
a*=m;
a=a%(1000000007);
}
printf("%lld\n",a);
}
return 0;
}
运用了类似莫队算法的想法,即每次从后往前,只移动一位,先对当前值除2,如果最高位为1,加上权重,否则不变,同时记录最大值
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1000000;
char s[MAXN+11];
int main() {
int t,cnt=1;
scanf("%d",&t);
while(t--) {
int k;
scanf("%d",&k);
scanf("%s",s);
int len1=strlen(s)-1,start=len1-k+1;
long long sum=0,ans=pow(2,k-1),max1=-1;
for(int i=start;i<=len1;i++)
sum=sum*2+s[i]-'0';
max1=max(max1,sum);
while(start>=0) {
start--;
sum/=2;
if(s[start]=='1')
sum+=ans;
max1=max(max1,sum);
}
printf("Case #%d: %lld\n",cnt++,max1);
}
return 0;
}
考虑贪心,《挑战程序设计》优先队列加油站例题类似。一开始写按照价格的优先队列,然后WA,改为在当前距离较远的优先队列,AC,神奇
#include<bits/stdc++.h>
using namespace std;
struct node{
int pi;
int ci;
};
vector<node> p;
vector<node> temp;
bool cmp(node a,node b) {
if(a.pi==b.pi)
return a.ci<b.ci;
else
return a.pi>b.pi;
}
int main() {
int N,L,Maxn,S;
while(~scanf("%d%d%d%d",&N,&L,&Maxn,&S)) {
p.clear();
for(int i=0;i<N;i++) {
node temp;
scanf("%d%d",&temp.pi,&temp.ci);
p.push_back(temp);
}
int start=0;
bool flag=true;
while(start+Maxn<L) {
temp.clear();
for(int i=0;i<N;i++) {
if(p[i].pi>start&&p[i].pi<=start+Maxn)
temp.push_back(p[i]);
}
sort(temp.begin(),temp.end(),cmp);
bool f1=false;
for(int i=0;i<temp.size();i++) {
if(temp[i].ci<=S) {
f1=true;
S-=temp[i].ci;
start=temp[i].pi;
break;
}
}
if(S<0||!f1) {
flag=false;
break;
}
}
if(flag)
puts("Yes");
else
puts("No");
}
return 0;
}