sdutoj 3560 - 3570 http://acm.sdut.edu.cn/sdutoj/problem.php?page=26
A
水题
#include
#include
#define mem(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int N = 100010;int a[5];
int main(){
int t;
scanf("%d",&t);
while(t--){
int a,b;scanf("%d%d",&a,&b);
printf("%d\n",a/b + (a%b!=0));
}
return 0;
}
B
二分,每次在FIb中找与当前所需数最接近的。。
//好吧,我们当时就是这么做的
#include
#include
#include
#include
#define mem(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int N = 100010;int a[5];
char s[50];
int f[111];
int ans[111];
int main(){
int t;
scanf("%d",&t);
f[0] = 1; f[1] = 2;
int r =0;
for(int i=2;;i++){
f[i] = f[i-1] + f[i-2];
if(f[i-2] + f[i-1] > 1e9) {
r = i;
break;
}
}
//cout< rear) po--;
ans[l++] = f[po];
rear-= f[po];
}
sort(ans,ans+l);
for(int i=0;i
让你找能否从节点n+1连通到节点0,不能输出-1。如果能,则找出从节点n+1到节点0最短的那条通路,输出这条通路中与0相连的节点序号。如果有多条通路,输出节点序号最小的那个,如果n+1节点与0节点直接相连,并且路径也是最短,则输出0;
#include
#include
#include
#include
#include
#define mem(a,x) memset(a,x,sizeof(a))
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int MAXN = 2020;
int n,m;
struct node{
int v, len;
bool operator < (const node & t) const{
return len > t.len;
}
node(int v = 0, int len = 0):v(v), len(len){}
}tp[MAXN];
vector G[MAXN];
bool vis[MAXN];
int dis[MAXN];
void Init(int n){
for(int i = 0; i <= n; i++){
vis[i] = false;
G[i].clear();
dis[i] = INF;
}
}
int dijstra_heap(int s){
priority_queueQ;
dis[s] = 0;
//vis[s] = 1;
Q.push(node(s,0));
while(!Q.empty()){
node now = Q.top();
Q.pop();
int v = now.v;
if(vis[v]) continue;
vis[v] = true;
for(int i=0;i
D
占坑
E
水题。
#include
#include
#include
#include
#define mem(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int N = 100010;int a[5];
char s[50];
int f[111];
int ans[111];
char G[111][111];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,m;scanf("%d%d",&n,&m);
mem(G,'.');
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
scanf(" %c",&G[i][j]);
}
int ans = 0;
for(int i=0;i<=n+1;i++){
for(int j=0;j<=m+1;j++){
if(G[i][j] =='.'){
int l = 0;
if(i-1>=0 && G[i-1][j] =='#') l++;
if(j-1>=0 && G[i][j-1] =='#') l++;
if(i
F
占坑
G
规律题,用NIM的方法(3个数异或)打出表来发现了规律。
奇数都是0,偶数的话发现都是1,4,13,40,,3n+1. 转换成二进制后发现与二进制中1的个数有关。
2个1,是1,3个1是4,4个1是13.。。
f[n] = f[n-1]*3 + 1
f[n-1]*3 = f[n-2]*9 + 3
f[n] = f[n-2]*9 + (1+3)
f[n] = f[n-3]*27 + (1 + 3 + 9)
这样推下去,得出
f[n] = f[1] *(3^(n-1)) + (1-3^(n-1))/(1-3) 。。。 (用到了等比数列求和公式 Sn = a1(1-q^n))/(1-q))
化简一下 f[n] = (3^n - 1)/2 (这里的n是二进制中1的个数-1)
这里学到一个gcc编译器的内建函数,__builtin_popcount(x)
直接统计整数x转换成2进制中有多少1。
#include
#include
#include
#include
#include
#include
#define mem(a,x) memset(a,x,sizeof(a))
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int MAXN = 2020;
int main(){
int T;scanf("%d",&T);
while(T--){
ll n;scanf("%lld",&n);
if(n < 6 || n&1) printf("0\n");
else{
int ans = __builtin_popcount(n);
if(ans <=1)printf("0\n");
else{
ans--;
printf("%lld\n",((ll)pow(3,ans)-1)/2);
}
//cout<
//学习别人的做法,自己的找不出错了。。不过这个代码更省内存吧
#include
using namespace std;
const int M =11111;
struct node{
int l,r;
}e[M];
int top;
char s[M];
char c[M][M/10];
char op[M];
int main(){
int T;scanf("%d",&T);
while(T--){
memset(s,0,sizeof(s));
int pos = 0, top = 0;
scanf("%s",op);
while(true){
scanf("%s",op);
int len = strlen(op);
int num = 0, i = 0;
for(i = 0;i < len ; i++){
if(op[i] != '[') c[top][i] = op[i];
else break;
}
c[top][i] = '\0';
for(i++;i
自己wa的代码,求指出啊~
#include
#include
#include
#include
#include
#include
#include
I
占坑
J
阅读理解题,对于玩过炉石传说游戏的来说就是秒A了(果然ACMer要什么都懂。。)
#include
#include
#include
#define mem(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int N = 100010;int a[5];
char s[50];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,hp; scanf("%d%d",&n,&hp);
getchar();
int C=0,M=0,O=0,B=0;
for(int i=0;i=0){
printf("Mrghllghghllghg!\n");
}
else
printf("Tell you a joke, the execution of Paladin.\n");
}
return 0;
}
字符串翻转,经典水题
#include
#include
#include
#define mem(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int N = 100010;int a[5];
char s[10100];
int main(){
int t;
scanf("%d",&t);
getchar();
while(t--){
gets(s);
int len = strlen(s);
//cout<=l;j--) printf("%c",s[j]);
if(i != len)
printf(" ");
else
printf("\n");
l = i+1;
//cout<<" "<